2015-10-13 1 views
0

Я реализовал dataSource для своего пользовательского UIControl и подключил его к контроллеру представления через Interface Builder. В инициализаторе мне нужно получить доступ к нему, чтобы установить мои представления. Я называю это так:DataSource, подключенный из Interface Builder, возвращает nil в инициализаторе

required public init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    translatesAutoresizingMaskIntoConstraints = false // Ensure Auto Layout is on 
    setGestureRecognizers() 

    labels = createButtons(dataSource.data) 
... 

} 

Приложение аварийно завершает работу, жалуясь, что dataSource равен нулю.

+0

Какой инициализатор вы делаете это? –

+0

init (coder: aDecoder) – jjatie

+0

ViewController был создан через раскадровку. Это точка входа в раскадровку. – jjatie

ответ

1

Вы не можете получить доступ к IBOutlet ссылкам (или что-либо, что настроено в раскадровке) во время init. Это должно быть отложено до viewDidLoad.

Руководство по программированию View Viewer для приятного обсуждения на эту тему. Он включал блок-схему, в которой описывалось, как выходные точки не подключены, когда контроллер представления сначала создается, но только позже в этом процессе, и его можно безопасно получить только в viewDidLoad (или позже в процессе, например, некоторые из методов внешнего вида), но не init.

enter image description here

+0

Да, мне нужно было создать функцию loadView() для моего настраиваемого элемента управления, который будет вызываться в функции viewDidLoad диспетчера вида. – jjatie

+0

@jjatie. Используйте только «loadView», если вы программно создаете представления для вашего контроллера. В противном случае пусть раскадровка или NIB выполнят эту работу, а логика инициализации зависит от этой раскадровки/NIB в 'viewDidLoad'. – Rob

+0

'loadView' находится в UIControl, а не в переопределении' viewController.loadView() '. Возможно, я мог бы назвать это лучше. – jjatie

Смежные вопросы