Nib / Xib对象生命周期

时间:2016-03-22 03:47:27

标签: ios cocoa-touch

现在我有一个rootViewController通过以下方式调用另一个作为nib文件的ViewController:

self.popViewController = PopViewController(nibName: "PopUpViewController_iPhone6Plus", bundle: bundle)

这个init是:

 override public init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

在rootViewController实例化PopViewController之后,它通过以下方式启动它:

self.popViewController.showInView(self, animated: true)

showInView是:

 func showInView(myRootViewController : MyRootViewController!, animated: Bool)
{
    self.myRootViewController = myRootViewController
    myRootViewController.view.addSubview(self.view)
    myTextField.delegate = self

    if animated
    {
        self.showAnimate()
    }
}

其中myTextField是PopViewController的IBOutlet。我意识到,如果我将myTextField.delegate = self放在myRootViewController.view.addSubview(self.view)之前,那么我会收到一个错误:fatal error: unexpectedly found nil while unwrapping an Optional value但是如果我之后说它一切都很好。

我查看了Nib files的文档,我的问题是:

当我将myTextField.delegate = self放在myRootViewController.view.addSubview(self.view)之前,我之所以收到错误的原因是因为IBOutlets在显示笔尖视图之前没有连接?

此外: 为什么要通过以下方式加载nib: self.popViewController = NSBundle.mainBundle().loadNibNamed("PopViewController_iPhone6", owner: PopViewControllerSwift.self, options: nil).first as! PopViewControllerSwift

抛出错误:

'NSUnknownKeyException', reason: '[<DeckWheel.PopUpAddDeckViewControllerSwift 0x10026cbe0> setValue:forUndefinedKey:]

1 个答案:

答案 0 :(得分:1)

使用NIB初始化视图控制器不会立即加载它。在查询视图控制器view之前,实际上并未加载NIB。

来自the docs for UIViewController's init(nibName:bundle:) method

  

您指定的nib文件不会立即加载。它是在第一次访问视图控制器的视图时加载的。如果要在加载nib文件后执行其他初始化,请覆盖viewDidLoad方法并在那里执行任务。

当然,在NIB加载之前,NIB中设置的插座连接无法连接。因此,在您查询view之前,您的网址为nil