2016-05-05 3 views
6

У меня были MyViewController.swift и MyViewController.xib, представляющие макет MyViewController.Загрузка ViewController из файла xib

Я пробовал разные методы, чтобы загрузить этот контроллер представления, включая:

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

вы можете увидеть полный код –

+0

@bluenowhere Проверьте все выходы, которые вы создали и связанные с компонентами. Убедитесь, что в '' Outlets' в инспекторе подключений в вашем файле '.xib' не должно быть восклицательного знака. –

+0

bluenowhere: вы нашли свой ответ? –

ответ

0

Try ниже код,

// 1

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

ИЛИ

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

Да, поскольку вы можете увидеть разные навыки написания кода. Некоторое время он не позволит инициализировать в пределах одной строки кода. –

2

Проблема не с методами ... Вы, наверное, держали выход (XXX), подключенный к некоторому UIElement и удалили его из соответствующего контроллера ... Я добавляю пример ниже ... enter image description here

выше кнопка, подключенная к контроллеру сейчас, но когда я комментировать выход enter image description here

мое приложение падает enter image description here

enter image description here

так пытаются найти выход (ххх), который отсутствует в ViewController, но в XIb file.Hope это помогает Обратите внимание на File's Owner :)

6

File's Owner

. В вашем случае File's Owner - MyViewController.

И следующие коды, если они выполняются в классе 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 

Он проходит self в owner. Таким образом, File's Owner - Foo, а не MyViewController. Тогда для класса Foo эти IBOutlet не могут быть подключены к Foo, это для 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

@Woodstock: Вид! Это правильный ответ на вопрос «Как загрузить * макет * ViewController из XIB-файла». Однако исходный вопрос неоднозначен, поскольку OP, похоже, не различает (1) загрузку макета (View) программно созданного ViewController из XIB и (2) загрузку самого экземпляра ViewController * из XIB , Ответ AechoLiu - правильный ответ на вторую интерпретацию :-) –

+0

@ ChrisHatton справедливая точка! – Woodstock

0

Я имел такую ​​же проблему. Созданный автоматически xib имел UIView.Вы должны удалить представление, добавить новый контроллер представления в xib, установить класс контроллера представления в тот, который вы хотите, а затем подключить выходы. После того, как все это вы можете использовать коды, приведенные выше, чтобы получить экземпляр этого вида контроллера, например:

if let menuVC = Bundle.main.loadNibNamed("MenuViewController", owner: nil, options: nil)?.first as? MenuViewController { 
      menuVC.profileType = profileType 
      vc.present(menuVC, animated: true, completion: nil) 
     }