2016-08-04 3 views
0

У меня есть табличное представление, и я хочу перейти к другому vc, когда один из строк постучал. моя функция didSelectRowAtIndexPath выглядит следующим образом. команда print работает и показывает строку с правым щелчком. но когда я использую self.navigationController? .pushViewController, он не переходит на vc с playVideo storyBoardId. после его изменения в presentViewController он работает. что случилось с моим кодом, который не работает?pushViewController не делает никаких действий

благодаря

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    print("clicked " + String(indexPath.row)) 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewControllerWithIdentifier("playVideo") as! PlayVideoViewController 

    vc.id = self.video[indexPath.row].id 

    // Present View as Modal 
    //presentViewController(vc as UIViewController, animated: true, completion: nil) 
    // Push View 
    //self.navigationController?.pushViewController(vc, animated: true) 
} 
+1

PlayVideoViewController не является корневым контроллером навигации, поэтому метод pushViewController не запускается. Вам нужно добавить контроллер навигации, перейдя на раскадровку, выберите PlayVideoViewController, в верхнем меню выберите «Редактор» -> «Вставить» -> «Контроллер навигации». Теперь ваш PlayVideoViewController станет корнем навигационного контроллера, и pushViewController должен работать нормально. – muazhud

+0

@muazhud Я сделал это так же, как вы и Bseaborn сказал. но все же он не работает –

ответ

3
  • Его поскольку контроллер вида, в котором вы сейчас находитесь, может не иметь навигационного контроллера.
  • Вы не можете нажать контроллер вида, не имея UINavigationController.
  • Если вам необходимо нажать контроллер вида, выполните следующие шаги.

    1. Вставить навигационный контроллер для текущего контроллера представления (Open раскадровка -> Выберите контроллер представления -> Выберите "Редактор" -> "Вставить в" -> UINavigationController).
    2. Теперь ваш код
    ?

    self.navigationController .pushViewController (ЖЕЛ, анимированные: правда)

будет работать нормально.

+0

Я думал, что ему нужен только контроллер nav. большая ошибка! спасибо за ваш ясный ответ –

+0

Добро пожаловать :-) – Bharath

+0

@Bharath, как это сделать программно? – Shyam

1

Убедитесь, что ваш ViewController действительно построен на NavigationController. Попробуйте направить линию:

self.navigationController!.pushViewController 

Если сбой, вы знаете, что навигация не установлена. Или вы можете просто проверить свою раскадровку, но это быстрый способ рассказать.

+0

он разбился. неожиданно нашел нуль при развертывании необязательного значения. но он имеет контроллер навигации. я не понимаю, почему он говорит nil –

+1

Я не совсем уверен в вашей настройке. Но удалите навигационный контроллер из раскадровки, нажмите на viewController, который вы хотели бы встроить в навигатор. Перейти к редактору -> Вставить In -> Контроллер навигации – Bseaborn

+0

сделал то же, что и вы сказали.но все же он не работает –

0

Я не знаю, почему вы делаете это так. Я думаю, что это излишне сложно.

Это должно в соответствии с Вашими функции didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier("playVideo", sender: tableView) 
} 

Затем вы можете указать столько перетекает, как вы хотите в этой функции:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "playVideo") { 
     let indexPath:NSIndexPath = tableView.indexPathForSelectedRow! 
     let PlayVideoViewController = segue.destinationViewController as! PlayVideoViewController 
     //you can pass parameters like project id 
     detailVC.projectID = ids[indexPath.row] 
    } 
} 

Ваш переход должен быть назван так в интерфейсе строителя :

named segue

+0

Я знаком с segue, но в моем случае использование push - лучший вариант;) –

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