Я создаю приложение (в XCode 8.2.1), где некоторые объекты отображаются на двумерной доске, а когда пользователь удаляет один из этих объектов, должна отображаться информация об этом как о стиле модальной информационной панели. Мой дизайн заключается в том, чтобы информация была написана в отдельном контроллере представления, который я бы отобразил, когда это необходимо.Swift/iOS: IBOutlet nil после загрузки контроллера просмотра
Я разработал базовый заглушку для второго контроллера представления и добавил в него ярлык в построителе интерфейса. Тогда Я Ctrl-сшитый этот ярлык на мой пользовательский класс VC:
class InfoViewController: UIViewController {
@IBOutlet weak var info: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
func displayInfo() {
info.attributedText = NSAttributedString(string: "abc")
}
}
Однако, когда я проверить мое приложение и нажмите на объект, то info
поле nil
даже в viewDidLoad()
метод моего пользовательского класса VC. То, как я уверен, отображение моего VC выглядит следующим образом:
let infoViewController = InfoViewController()
infoViewController.modalPresentationStyle = .overCurrentContext
self.present(infoViewController, animated: true, completion: nil)
infoViewController.displayInfo()
(Примечание: В конце концов, у меня будет только один единственный экземпляр InfoViewController
, но это только для тестирования я не ожидаю, имея глобальный экземпляр. будет никакой разницы?)
Как я уже говорил, будь то внутри метода viewDidLoad()
или в методе displayInfo()
, info
всегда nil
, таким образом, что установка его атрибут attributedString
сбой приложения. Думать, что метод present
можно назвать асинхронным, я попытался позвонить displayInfo()
изнутри viewDidLoad()
, но это не имело никакого значения.
Может ли кто-нибудь сказать мне то, что я забыл, что позволило бы корректно инициализировать мой IBOutlet
?
Спасибо!
Дэвид
Проблема заключается в том, что вы выполнили 'InfoViewController()', создавая экземпляр контроллера просмотра независимо от любой сцены раскадровки. Вы хотите использовать ['storyboard.instantiateViewController'] (https://developer.apple.com/reference/uikit/uistoryboard/1616214-instantiateviewcontroller). – Rob
Вы используете раскадровку? если да, то я предполагаю, что вы должны получить 'InfoViewController' из раскадровки, а не путем создания нового экземпляра ... –