Все IBOutlets становятся нулевыми после перехода на Xcode 6 Beta 5

Например, в контроллере представления есть свойство

@IBOutlet weak var nameLabel: UILabel!

Это свойство nil внутри viewWillAppear и viewDidLoad, поэтому приложение выходит из строя во время выполнения.

Он отлично работал в Xcode 6 Beta 4. После того, как я перешел на бета-версию 5, он пожаловался на класс контроллера does not implement its superclass required members. Поэтому я добавил

required init(coder aDecoder: NSCoder!) {
  super.init(coder: aDecoder)
}

И эта ошибка компилятора исчезла. Однако приложение падает на unexpectedly found nil while unwrapping an Optional value, потому что это свойство nameLabel равно nil, когда я пытаюсь установить его text.

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

Ответ 1

У меня была такая же проблема в Beta5. Это, по-видимому, проблема, когда

init(nibName: nil, bundle: nil) 

не сопоставляет nil с именем nibName по умолчанию. Когда я перешел на явное имя nibName, это сработало. В частности, в моем случае, используя новый? Оператор:

override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
   // beta5 workaround: replace nil with explicit name of xib file
   let nib = nibNameOrNil ?? "MyViewController"

   super.init(nibName: nib, bundle: nibBundleOrNil)

   // local initialization here
}

заставляло это волшебно работать снова.

Ответ 2

Это временная ошибка. Обходной путь оказывается: объявите контроллер вида таким образом, чтобы переопределить имя, например:

@objc(ViewController) ViewController : UIViewController { // or whatever its name is

См. также: Являются ли контроллеры представлений с файлами nib в ios 8 beta 5?

EDIT Эта ошибка исправлена ​​в iOS 9 beta 4.