持っていた MyViewController.Swift
およびMyViewController.xib
MyViewControllerのレイアウトを提示します。
このView Controllerをロードするためのさまざまな方法を試しました:
//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)
3番目は成功した初期化のみですが、前の2つはエラーの原因です。
キャッチされない例外「NSUnknownKeyException」によるアプリの終了、
理由: '[setValue:forUndefinedKey:]:このクラスは、キーXXXのキー値コーディングに準拠していません。
これらの読み込み方法の何が問題になっていますか?
Swift
let myViewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.present(myViewController, animated: true, completion: nil)
またはNavigation Controllerをプッシュ
self.navigationController!.pushViewController(MyViewController(nibName: "MyViewController", bundle: nil), animated: true)
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
self
をowner
として割り当てます。したがって、File's Owner
はFoo
ではなくMyViewController
です。次に、Foo
クラスの場合、それらのIBOutlet
をFoo
に接続できません。そのため、例外がスローされます。
extension UIViewController {
static func loadFromNib() -> Self {
func instantiateFromNib<T: UIViewController>() -> T {
return T.init(nibName: String(describing: T.self), bundle: nil)
}
return instantiateFromNib()
}
}
次のように使用します。
let testVC = TestVC.loadFromNib()
同じ問題がありました。自動生成されたxibにはUIViewが含まれていました。ビューを削除し、新しいView Controllerをxibに追加し、View Controllerクラスを目的のクラスに設定してから、コンセントを接続する必要があります。このすべての後、上記のコードを使用して、次のようにこのView Controllerのインスタンスを取得できます。
if let menuVC = Bundle.main.loadNibNamed("MenuViewController", owner: nil, options: nil)?.first as? MenuViewController {
menuVC.profileType = profileType
vc.present(menuVC, animated: true, completion: nil)
}
@AechoLiuの答えは素晴らしい。私は同じ質問をして、以下の修正でそれに答えました。
問題:
let vc1 = NSViewController(nibName: YDNibIdentifier.myplainvc, bundle: nil)
修正:
let vc1 = MyPlainViewController(nibName: YDNibIdentifier.myplainvc, bundle: nil)
.xibファイル内で正しく接続されていたにもかかわらず、誤ってNibファイルを間違ったClas(NSViewController)にキャストしていました。