2015-05-05 4 views
0

моего код работает, но я получаю предупреждение:Инициирование контроллера вида в Swift

Null передается в вызываемом, который требует непустого аргумента

Очевидно, что это из-за следующим линия:

MyViewController *vc = [[MyViewController alloc] initWithCoder:nil]; 

MyViewController является Swift класс. Я применил в нем необходимый метод initWithCoder.

Мой вопрос прост - какой параметр я должен пройти до initWithCoder, чтобы убить предупреждение или какую альтернативную команду init использовать?

NB: Контроллер представления, который я инициализирую, написан в Swift. Однако я инициализирую его из класса Objective-c.

+2

Ваше название и тег говорит 'Swift', в то время как ваш код' Objective-C' –

+0

Вы можете немного уточнить этот вопрос? Вы заявляете, что инициализируете контроллер вида в Swift и настоящий код, показывающий инициализацию с использованием цели-c. В любом случае документы указывают, что init coder - «Возвращает объект, инициализированный из данных в данном unarchiver. (Обязательно)« Вы не поставляете кодер в своей цели-c. Вы также можете получить сообщение об ошибке, связанной с необходимостью добавления @objc перед классом Swift. –

+0

Сделано редактирование, чтобы уточнить. –

ответ

0

Вы должны сделать это по-другому. Если вы используете storyboards:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 

Если storyboard отличается

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil]; 

Или от xib:

MyViewController *controller = [[MyViewController alloc] initWithNibName:nibName bundle:nil]; 

Или, если это из кода полностью:

MyViewController *controller = [[MyViewController alloc] init]; 

Также удалите -initWithCoder: метод от вашего кода

+0

Спасибо за ответ. Контроллер представления создается в коде (без раскадровки или Xib). Кроме того, хотя VC написан в Swift, мне нужно запустить его из Objective-c. Как ваше окончательное решение было бы записано в Objective-C? Я пробовал '' 'vc = [[MyViewController alloc] init]' '', но я получаю сбой. –

+0

Какая авария вы получили? – Azat

+0

Я попытался снова, и это сработало, когда я также удалил метод initWithCoder с моего контроллера. Если вы обновите свой ответ, чтобы показать, что ваше окончательное решение + удалить метод initWithCoder из VC, я буду отмечать его как правильно. –

0

Учитывая, что у вашего контроллера просмотра нет ниба или раскадровки, вы не должны использовать initWithCoder в Swift. Обратите внимание эту информацию из документации UIViewController:

Обсуждение

Это назначенный инициализатор для этого класса.

Указанный файл ниба не загружается сразу. Он загружается при первом просмотре представления контроллера. Если вы хотите выполнить дополнительную инициализацию после загрузки файла nib, переопределите метод viewDidLoad и выполните там свои задачи.

Если вы указываете nil для параметра nibName и вы не переопределяете метод loadView, контроллер вида ищет файл nib с использованием других средств. См. NibName.

Если ваше приложение использует раскадровку для определения контроллера вида и связанных с ним представлений, ваше приложение никогда не будет инициализировать объекты этого класса напрямую. Вместо этого, диспетчеры представлений либо создаются раскадрой либо автоматически с помощью iOS, когда segue запускается, либо программно, когда ваше приложение вызывает метод instantiateViewControllerWithIdentifier: При создании экземпляра контроллера вида из раскадровки iOS инициализирует новый контроллер представлений, вызывая его метод initWithCoder:. iOS автоматически устанавливает свойство nibName в файл nib, хранящийся внутри раскадровки.

Дополнительные сведения о том, как контроллер представления загружает его представление, см. В разделе Управление ресурсами в контроллерах представления.

Вот что говорит Управление ресурсами об инициализации программно.

Initializing View контроллеры Программного Если контроллер представления распределяет свои ресурсы программно создать пользовательский метод инициализации, специфичные для вашего контроллера представления. Этот метод должен вызывать метод init суперкласса, а затем выполнять любую инициализацию, специфичную для класса.

В общем, не пишите сложные методы инициализации. Вместо этого реализуйте простой метод инициализации, а затем предоставите свойства для клиентов вашего контроллера просмотра для настройки его поведения.