2013-07-23 6 views
2

В моем приложении iOS я пытаюсь представить новый ViewController «выше» текущего. После this Apple, директив, в каком-то случае я использую следующий код:iOS - представление ViewController с presentViewController: не работает

MyViewController* vc = [[MyViewController alloc] initWithNibName: nil bundle: nil]; 
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController: vc]; 
[mainController presentViewController:nc animated:YES completion:nil]; 

Этот код называется (и это происходит после успешной загрузки основного контроллера, а не в viewDidLoad) и новый вид появляется, используя выбранный стиль перехода.
Создан класс MyViewController, и его методы, такие как viewDidLoad и supportedInterfaceOrientations, успешно вызываются.

Теперь проблема здесь.
В построителе интерфейса создаю контроллер, установив его класс в MyViewController. Я создаю несколько представлений внутри этого контроллера, например, UIButton. MyViewController обладает свойством

IBOutlet UIButton* button 

На раскадровке, ссылки на выход из помещенного UIButton устанавливается в свойство контроллера «Кнопка». В качестве двойной проверки в разделе «Outlets» контроллера вида на кнопке раскадровки привязывается к размещенному объекту UIButton.

Но когда вызывается viewDidLoad, значение свойства кнопки равно нулю. Естественно, кнопка не отображается. То же самое касается два UITableView объектов (они DataSource и делегат оба настроены на один контроллер представления и MyViewController соответствует

<UITableViewDelegate, UITableViewDataSource> 

в случае, если это важно).

Кроме того, черный экран, который появляется, игнорирует все касания (и распознающий признак жестов помещается на контроллер на раскадровке). Но он реагирует на изменения ориентации.
Я полагаю, проблема в том, что созданный экземпляр MyViewController не смог «увидеть» раскадровку, и я пропустил что-то очень основное, но я не вижу никаких намеков в документации Apple.

+0

Просто выполните '[[MyViewController alloc] init]', и он должен автоматически выбрать правильный ниб/комплект. –

+0

@MikeWeller Нет, это не так. init фактически приводит к вызову initWithNibName: Bundle: с обоими аргументами nil. – Abstraction

+0

Я просто говорю, что это проще и чище (ИМХО). –

ответ

3

Вы неправильно инициализируете MyViewController. Поскольку вы используете «раскадровку», вы должны дать имя Идентификатора (в раскадровке), а затем инициализировать свой контроллер из раскадровки.

MyViewController* vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 
+0

Спасибо. Это прекрасно работает. С другой стороны, если у кого-то есть такая же проблема, и после исправления проблемы возникает проблема с идентификаторами ячеек в представлении таблицы, обязательно проверьте [этот пост] (http://stackoverflow.com/questions/12737860/assertion-failure- in-dequeuereusablecellwithidentifierforindexpath). – Abstraction

+0

Thats может помочь, проблема в том, что на ios 7 это не работает ... –

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