使用Nib创建View Controller

当使用可视化方式创建View Controller时,我们通常都是使用Storyboard进行的。我们通常会在同一个Storyboard中创建一大堆的View Controller,这样又容易导致代码冲突,因此有时候我们可以考虑直接使用Nib来创建单个View Controller。步骤如下:

步骤一:创建Nib

有两个方法可以创建这样的Nib。

方法一:使用Xcode的View Controller模板(推荐)

点击Command + N创建UIViewController的子类时,选中“Also create XIB file”,Xcode就会自动生成并配置好一个同名的Xib文件,我们直接往里面拖控件、拉线就可以了。


CreateXibFromTemplate.png

方法二:手动创建Xib文件

手动创建Xib文件有点麻烦,但能对Xib的机制有更多的理解。假设此处的UIViewController的子类名为NibViewController,手动创建的步骤如下:

  1. 点击Command + N创建一个空白的Xib文件,可以任意命名,但通常来说我们让它与UIViewController的子类同名,即NibViewController。


    CreateXib.png
  2. 打开这个新建的Xib文件,向其中拖入一个UIView控件。注意,这里拖入的是UIView,而不是UIViewController!
  3. 点击File's Owner,在Identity inspector中将它的Class设置为NibViewController,在Collection inspector中将view与刚才拖进来的UIView控件连起来。注意,这里不需要设置那个UIView控件的class。
FileOwnerConnection.png
FileOwnerIdentify.png

完成上述步骤之后,这个Xib文件就配置好了。接下来按正常流程往上面的UIView控件中添加其他控件、设置属性、往NibViewController中拖线就行了。

上面的配置中有个很有意思的一点,那就是设置“File's Owner”,那“File's Owner”是什么?

  • 设置Nib的File's Owner,而不设置UIView的class时,就可以基于Nib创建UIViewController
  • 设置UIView的class,而不设置Nib的File's Owner,就是基于Nib创建UIView。

“File's Owner”是什么

Apple官方文档对“File's Owner”的描述如下:

One of the most important objects in a nib file is the File’s Owner object. Unlike interface objects, the File’s Owner object is a placeholder object that is not created when the nib file is loaded. Instead, you create this object in your code and pass it to the nib-loading code. The reason this object is so important is that it is the main link between your application code and the contents of the nib file. More specifically, it is the controller object that is responsible for the contents of the nib file.

In Xcode, you can create connections between the File’s Owner and the other interface objects in your nib file. When you load the nib file, the nib-loading code recreates these connections using the replacement object you specify. This allows your object to reference objects in the nib file and receive messages from the interface objects automatically.

对于File's Owner,需要记住以下两点,

  • File's Owner对应的是这个方法的ownerBundle.loadNibNamed(_ name: String, owner: Any?, options: [AnyHashable : Any]? = nil)

  • 当nib文件被加载之后,你希望能在代码中控制它内部的控件,可以将某个自定义Class(通常是UIViewController的子类)设置为这个Nib文件的File's Owner,然后将Nib文件的子控件的Outlet设置到File's Owner的class中。

对于第二点,大家可能会疑惑,为什么要设置File's Owner,我们平时都是直接设置UIView的class的啊?没错,当我们使用Nib来创建自定义的UIView时,是将这个UIView控件的Class设置为我们自定义的UIView class类型,但当我们要使用Nib来创建自定义的UIViewController时,就必须要设置File's Owner了,因为这种方式下,我们是将一个UIView控件,而不是UIViewController控件,拖到Nib文件中,作为最底层的superView,然后再UIViewController子类中设置控件的Outlets,而我们显然不能将一个UIView控件的class设置为一个UIViewController子类,这时就只能通过File's Owner来实现了。

步骤二:初始化UIViewController

UIViewController有一个nibName的property,当该property不为空时,UIViewController.loadView()会从依据那个nib文件加载UI。nibName的设置有以下方式,每种方式都代表了一种初始化NibViewController的方法。

方法一(推荐):UIViewController.init(nibName:bundle:)

使用UIViewController.init(nibName:bundle:)来显示地指定nibName

let controller = NibViewController(nibName: "NibViewController", bundle: nil)

方法二:UIViewController.init() + nib文件自动匹配

使用UIViewController.init()时,若iOS能在bundle中根据view controller的class name匹配到一个nib文件,就会隐式地指定nibName。nib文件的匹配规则如下:

  • 如果view controller的class name以Controller结尾,比如NibViewController,那么系统就会匹配不包括Controller的nib文件,即NibView.nib
  • 系统还会匹配完全同名的nib文件。比如,对于NibViewController,匹配NibViewController.nib。这也是为什么推荐nib文件与view controller同名的原因。
// If the nib file name is NibView.nib or NibViewController.nib
let controller = NibViewController()

方法三:UIViewController.init() + override var nibName: String?

我们还可以通过override``nibName的方式显示的指定nibName。假如NibViewController对应的nib文件是RandomNibName.nib,那么可以使用以下代码创建NibViewController的实例。

class NibViewController: UIViewController {

    override var nibName: String? {
        return "RandomNibName"
    }

}

let controller = NibViewController()

需要注意的是,当我们override var nibName: String?后,即便使用UIViewController.init(nibName:bundle:),也无法修改nibName

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容