2015-05-13 2 views
10

Я реализую интерфейс поиска для своего приложения, поэтому в основном я передам ключевое слово поиска из одного ViewController в другой ViewController.Не удалось присвоить значение типа 'UINavigationController'

Я сделал этот тип параметров несколько раз, но на этот раз кажется странным. Целевой объект ViewController встроен в контроллер навигации.

Теперь код выглядит примерно так.

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) { 
    if (segue?.identifier == "home_to_search") { 

     var searchKeyword = txtSearchBarHome.text 
     var svc = segue?.destinationViewController as! SearchViewController; 
     svc.toPassSearchKeyword = searchKeyword; 

     //let nav = segue?.destinationViewController as! UINavigationController 
     //let svc = nav.topViewController as! SearchViewController 
     //svc.toPassSearchKeyword = searchKeyword; 
    } 
} 

я уже исследовал эти вопросы DestinationViewController Segue and UINavigationController swift, How do I segue values when my ViewController is embedded in an UINavigationController? не повезло.

Что заставляет меня задаться вопросом, что у меня уже есть ViewControllers, встроенные в навигационные контроллеры, которые я могу передать параметрам segueing. Однако в этом случае он выбрасывает Не удалось отличить значение ошибки «UINavigationController». Если я пробую прокомментированный код выше, он не вызывает ошибку там, а в классе AppDelegate.

+0

Я иногда сталкиваюсь с этим, когда я не задал свой собственный класс в построителе интерфейса на моем UIViewController или UINavigationController. Проверьте 3-ей вкладку, когда вы выберете свой элемент в построителе интерфейса и убедитесь, что вы правильно настроили его. – Chackle

+0

Во-первых, спасибо. Но я проверил с доски истории и, похоже, указал на правильный класс. –

+0

Похоже, что если вы нажимаете на навигационный контроллер, вам может потребоваться, чтобы дочерний контроллер просмотра (ваш searchviewcontroller) передал ему значение. Имеет ли это смысл? EDIT: Извините, я видел ваш прокомментированный код. Это именно то, что я бы сделал. Я буду исследовать, могу ли я найти проблему. Какая ошибка бросается на appdelegate? – Chackle

ответ

29

Отвечая на мой собственный вопрос. В этом случае необходимо открыть представление ребенка делать что-то вроде этого:

let nav = segue?.destinationViewController as! UINavigationController 
let svc = nav.topViewController as! SearchViewController 
svc.toPassSearchKeyword = searchKeyword; 
+1

Иди в эту же проблему, но поскольку у меня есть несколько отрезков, мне пришлось сначала выполнить проверку типа класса. segue.destinationViewController.isKindOfClass (UINavigationController) – Bob

+0

Спасибо! В настоящее время это проблема в «App Development with Swift» от Apple, на стр. 551, когда они просят вас свалить segue.destination как! AddEditEmojiTableViewController, забыв, что между ними есть контроллер навигации. Я замечаю, что качество этой книги ухудшается по мере того, как я ее переживаю, она стала супер солидной, теперь некоторые из них становятся сомнительными до конца - умышленно или нет. – Othyn

+0

Это помогло мне. Большинство гидов забывают об этой части! – David

0

На основании ответа Семих, вы также можете сделать это, чтобы передать переменную в следующем Segue, если вы не хотите использовать идентификатор :

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