2016-05-13 1 views
1

Я работаю над проектом с функцией поиска. У меня 3 контроллера вида, то есть HomeViewController, SearchResultViewController и DetailViewController.Как выполнить функциюSegueWithIdentifier() из динамически созданного UIViewController, свойство раскадровки которого равно nil

На главной странице у меня есть панель поиска (с использованием UISearchController) в пределах navigationBar вместе с некоторым фиктивным контентом. Важно отметить, что я использую отдельный контроллер (в моем случае это SearchResultController), чтобы показать результаты. Этот SearchResultController фактически является подклассом TableViewController, который отображает результат в виде таблицы. Здесь все работает нормально.

Проблема

Теперь, когда я выбрать любую строку из результата (т.е. при SearchResultViewController) Я хочу, чтобы открыть другой контроллер представления (DetailViewController), где я буду показывать подробности об этой выбранной позиции , Это очень простая вещь, но я застрял здесь.

Хорошо, продолжая с этой проблемой я реализованный методом didSelectRowAtIndexPath и от этого я звоню performSegueWithIdentifier, и я получаю сообщение об ошибке «приемник не имеет SEGUE с идентификатором», поскольку раскадровка свойство равно нуль (Упоминается в документации).

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("storyboard property is \(self.storyboard)") 
     performSegueWithIdentifier(segueIdentifier, sender: indexPath.row) 
    } 

Примечание: segueIdentifier такой же, как это на раскадровке. Я получаю, что свойство раскадровки - это нуль.

Я думаю

Когда я нажимаю на панели поиска, IOS внутренне создает и загружает экземпляр SearchResultController для отображения результата и, следовательно, его раскадровка свойство равно нулю, и из-за того, что я получаю выше ошибки.

Может кто-нибудь дать решение этой проблемы или любой указатель в правильном направлении.

+1

вам не нужно SEGUE в этом случае просто инстанцирует контроллер представления и представить его – Scriptable

+0

вы не можете непосредственно перейти которые не определяют в раскадровку создать экземпляр и просто нажать от навигации или представить его –

+0

@Scriptable Да, просто используется presentViewController(), и он работает нормально. благодаря –

ответ

2

Если вы создаете ViewController программно, то вы должны нажать на навигационном контроллере, как,

UIViewController *vc = [[UIViewController alloc]init]; //your viewcontroller here 

[self.navigationController pushViewController:vc animated:YES]; 

//or if you want to present it then 

[self presentViewController:vc animated:YES completion:nil]; 

Вы не можете выполнить переход, потому что нет Segue без раскадровки

Что-то вроде этого в быстром

let vc: UIViewController = UIViewController() 
    //your viewcontroller here 
    self.navigationController!.pushViewController(vc, animated: true) 
    //or if you want to present it then 
    self.presentViewController(vc, animated: true, completion: { _ in }) 

Исправлена ​​ошибка в использовании!

надеюсь, что это поможет :)

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

  • Нет связанных вопросов^_^