blu*_*ere 28 initialization xib viewcontroller ios swift
我有一个MyViewController.swift和一个MyViewController.xib呈现MyViewController的布局.
我尝试了不同的方法加载这个视图控制器,包括:
//1
let myVC = UINib(nibName: "MyViewController", bundle:
nil).instantiateWithOwner(nil, options: nil)[0] as? MyViewController
//2
let myVC = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)[0] as? MyViewController
//3
let myVC = MyViewController(nibName: "MyViewController", bundle: nil)
Run Code Online (Sandbox Code Playgroud)
第三个是唯一成功的初始化,但前两个导致错误:
由于未捕获的异常'NSUnknownKeyException'而终止应用,
reason:'[setValue:forUndefinedKey:]:此类不是密钥XXX的密钥值编码兼容.
这些加载方法有什么问题?
Mar*_*cas 72
斯威夫特3
let myViewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.present(myViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
或推入导航控制器
self.navigationController!.pushViewController(MyViewController(nibName: "MyViewController", bundle: nil), animated: true)
Run Code Online (Sandbox Code Playgroud)
Aec*_*Liu 12
请注意File's Owner.在你的情况下,File's Owner必须是MyViewController,或者是sub-class.
以下代码,如果它在课堂上执行Foo.
// If `self` is an instance of `Foo` class.
// In this case, `File's Owner` will be a `Foo` instance due to `self` parameter.
let myVC = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)[0] as? MyViewController
Run Code Online (Sandbox Code Playgroud)
它通过self了owner.所以,File's Owner是Foo,不是MyViewController.然后,对于Foo课堂,那些IBOutlet不能连接Foo,那些File's Owner是为了File's Owner.所以,它崩溃了.
extension UIViewController {
static func loadFromNib() -> Self {
func instantiateFromNib<T: UIViewController>() -> T {
return T.init(nibName: String(describing: T.self), bundle: nil)
}
return instantiateFromNib()
}
}
Run Code Online (Sandbox Code Playgroud)
使用它如下:
let testVC = TestVC.loadFromNib()
Run Code Online (Sandbox Code Playgroud)
尝试下面的代码,
//1
let nib = UINib(nibName: "MyViewController", bundle:nil)
myVC = nib.instantiateWithOwner(self, options: nil)[0] as? MyViewController
Run Code Online (Sandbox Code Playgroud)
或者
myVC = nib.instantiateWithOwner(self, options: nil).first as? MyViewController
Run Code Online (Sandbox Code Playgroud)
//2
let nib : NSArray = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)
myVC = nib.objectAtIndex(0) as? MyViewController
Run Code Online (Sandbox Code Playgroud)
这会起作用。
| 归档时间: |
|
| 查看次数: |
49948 次 |
| 最近记录: |