2016-05-05 8 views
6

MyViewController.swiftMyViewController.xibはMyViewControllerのレイアウトを表していました。xibファイルからViewControllerをロード

私は、このビューコントローラを含むをロードするためにさまざまな方法を試してみました:

//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) 

三つだけ成功した初期化ですが、前の二つは、エラーの原因となっている:それらと間違って何

Terminating app due to uncaught exception 'NSUnknownKeyException',

reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key XXX.

メソッドを読み込む?コードの下

+0

はあなたが作成し、コンポーネントを接続しているすべてのコンセントをチェック@bluenowhere完全なコード –

+0

を見ることができます。あなたの '.xib'ファイル内の' 'connection inspector''の' Outlets'に感嘆符を付けないでください。 –

+0

bluenowhere:答えは見つかりましたか? –

答えて

0

てみてください、

// 1

let nib = UINib(nibName: "MyViewController", bundle:nil) 
myVC = nib.instantiateWithOwner(self, options: nil)[0] as? MyViewController 

OR

myVC = nib.instantiateWithOwner(self, options: nil).first as? MyViewController 

が// 2

let nib : NSArray = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil) 
myVC = nib.objectAtIndex(0) as? MyViewController 

これは動作します。

+1

コードに間違いを説明し、コードがそれを解決するためにどのように役立つかを説明してください:) –

+0

コードを書くためのさまざまなスキルを見ることができます。しばらくすると、1行のコード内で初期化することはできません。 –

2

問題は...あなたはおそらく、いくつかのUIElementのために接続された出口(XXX)を続けていると...私は以下の例を追加していコントローラに対応するからそれを削除した...メソッドではないenter image description here

上記のボタンは現在、コントローラーに接続されているが、私は口 enter image description here

私のアプリがクラッシュ enter image description here

enter image description here

コメントするとき10

はそれほどのViewControllerから欠落しているアウトレット(XXX)を見つけることを試みるが、それは:)

6

File's Owner

お知らせFile's Ownerを助けXIBのfile.Hopeです。あなたの場合、File's OwnerMyViewControllerです。

また、次のコードは、クラスFooで実行されています。

// If `self` is an instance of `Foo` class. 
// In this case, `File's Owner` will be a `Foo` instance. 
let myVC = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)[0] as? MyViewController 

それはownerとしてselfを渡します。したがって、File's OwnerFooであり、MyViewControllerではありません。次にFooクラスの場合、IBOutletFooに接続できません。これはMyViewControllerです。だから、クラッシュする。ナビゲーションコントローラ内

24

スウィフト3

let myViewController = MyViewController(nibName: "MyViewController", bundle: nil) 
self.present(myViewController, animated: true, completion: nil) 

またはプッシュ

self.navigationController!.pushViewController(MyViewController(nibName: "MyViewController", bundle: nil), animated: true) 
+1

これは正解です。 – Woodstock

+0

@ウッドストック:種類の! 「XIBファイルから* ViewControllerのレイアウトをロードするにはどうすればよいですか?」という質問に対する正解です。 しかし、OPは(1)プログラムでインスタンス化されたViewControllerのレイアウト(View)をXIBからロードすることと、(2)XIBからViewControllerインスタンスをロードすること。 AechoLiuの答えは、2番目の解釈の正しい答えです:-) –

+0

@ChrisHatton fair point! – Woodstock

0

私は同じ問題を抱えていました。自動的に生成されたxibにUIViewがありました。ビューを削除し、新しいView Controllerをxibに追加し、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) 
     } 
関連する問題