2016-04-15 2 views
0

У меня есть несколько контроллеров представлений, встроенных в один контроллер навигации. Как мне показать более ранний vc из vc дальше вниз. Это то, что я пробовал:Отображение существующего контроллера представлений в программном программировании

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("MenuViewController") as! MenuViewController 
     self.presentViewController(vc, animated: true, completion: nil) 

Это не работает и возвращает следующее сообщение об ошибке:

fatal error: unexpectedly found nil while unwrapping an Optional value 

enter image description here

+0

'' MenuViewController '' определенно правильный? – zcui93

+1

Люди отвечают, чтобы исправить вашу ошибку, но исправление вашей ошибки не изменит того факта, что это создаст новый контроллер и представит его, а не вернется к существующему контроллеру. Чтобы вернуться назад, вам нужно использовать режим размотки или один из методов pop/увольнения на вашем навигационном контроллере. – dan

+0

Вы хотите отключить стек контроллеров представления в навигационном контроллере, чтобы вернуться к предыдущему контроллеру представления (разматывать segue), или вы хотите нажать новый контроллер просмотра на контроллер навигации (что подразумевает ваш код)? –

ответ

-1

Избегайте принудительного разворачивания в любое время !!

if let storyboard = self.storyboard{ 
    if let vc = storyboard.instantiateViewControllerWithIdentifier("MenuViewController") as? MenuViewController { 
    self.presentViewController(vc, animated: true, completion: nil) 
    } 

} 

Это остановит приложение от сбоя, но не все решение вашей проблемы. Идентификатор MenuViewController неверен, или раскадровка равна нулю.

+0

, когда я перехожу к 'let vc = self.storyboard? .instantiateViewControllerWithIdentifier (« MenuViewController ») как? MenuViewController', Xcode попросил меня изменить 'as?' На 'as!' –

+0

Не забывайте, что if и фигурная скобка. Возможно, вам придется сначала развернуть раскадровку. –

+0

Я добавил оператор if и проверил, что код действительно вводит его, и он делает, но я все равно получаю ту же ошибку. Так что у меня есть проблема с 'self.presentViewController (vc, animated: true, completion: nil)'? –

0

Предполагая, что вы правильно указали «MenuViewController», вероятно, вы неправильно добавили идентификатор раскадровки в контроллер вида.

Перейдите на свою раскадровку и нажмите соответствующий контроллер просмотра, нажмите на Идентификационный инспектор и введите «MenuViewController» в поле идентификатора раскадровки.

Кроме того, измените свой код на Эндрю для лучшей практики.

+0

Вам не оставили редактировать это задание? – Caleb

+0

Ой, да, я открывал это время. Что произойдет, если вы используете if let let? Вы недавно очистили проект? –

+0

Кроме того, вы попробовали раскручивать его или это не вписывается в поток? –

0

Я не совсем уверен, чего вы пытаетесь достичь с помощью вышеуказанного кода, но если вы хотите вернуться к предыдущему контроллеру представления, вы должны использовать делегат, чтобы сообщить представителю VC, что это сделано с его работой и то контроллер представления должен отклонить его с помощью навигационного контроллера. Контролеры просмотра должны избегать увольнения, так как они не знают, как они были представлены, поэтому всегда (по крайней мере, в 99% случаев) должен быть докладчиком, который отклоняет, поскольку он знает, как он представлен.

Принимая это во внимание, вы можете отклонить VC в контроллер навигации с помощью:

self.navigationController?.popViewControllerAnimated(true)

или

self.navigationController?.popToViewController(<#MyViewController Reference#>, animated: true).