navigationController?.pushViewController не может запустить представление

Язык Свифт 4.

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

Для этого я реализовал следующую функцию:

// launch the detail view controller
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let detailView = DetailVC()
    detailView.customInit(detailID: tempViewData[indexPath.section].detailIDs[indexPath.row])
    setupTableView.deselectRow(at: indexPath, animated: true)
    self.navigationController?.pushViewController(detailView, animated: true)
}

Однако, когда я запускаю приложение, в то время как в списке ошибок нет, подробный вид не запускается. Что я делаю не так?


person CMan    schedule 01.11.2017    source источник
comment
Вы поместили этот viewController в UINavigationController и установили делегата setupTableView для этого viewController   -  person ZHZ    schedule 01.11.2017
comment
Я не совсем уверен, о чем вы спрашиваете. В этой функции viewDidLoad контроллера представления я добавил: setupTableView.delegate = self   -  person CMan    schedule 01.11.2017
comment
но он не отображает контроллер подробного представления.   -  person CMan    schedule 01.11.2017
comment
Тогда наиболее вероятная причина заключается в том, что self.navigationController является nil. Вы встроили свой контроллер представления в контроллер навигации?   -  person Paulw11    schedule 01.11.2017
comment
Вызывается ли этот метод didSelectRowAt? Если да, то если self.navigationController ненулевое значение?   -  person rmaddy    schedule 01.11.2017
comment
Я не встраивал контроллер setupTableView в контроллер навигации. Я настроил пользовательский интерфейс с помощью раскадровки и создал 3 контроллера представления, но не контроллер навигации. Я использую переход для перехода от первого контроллера представления (который представляет собой просто экран с несколькими кнопками на нем) к setupVC, и это работает правильно. У меня есть панель навигации вверху, чтобы предоставить кнопку «Назад». Я попытался использовать переход вместо строки self.navigationController?.pushViewController, но это привело к ошибке. Нужно ли встраивать все в навигационный контроллер?   -  person CMan    schedule 01.11.2017


Ответы (2)


Выберите свой первый viewController в Storyboard, затем вставьте его в UINavigationController из меню, подобного этому. введите здесь описание изображения

person ZHZ    schedule 01.11.2017
comment
Это сработало, однако теперь с моего начального контроллера представления, когда я нажимаю кнопку, чтобы отобразить SetupVC, он отображает его на секунду, а затем снова отображает. Зачем это делать? - person CMan; 01.11.2017
comment
Хорошо, я решил проблему. На моем начальном контроллере представления я настроил переход к SetupVC. Затем я создал выход действия из той же кнопки и вызвал функцию перехода. Я закомментировал этот переходный вызов, и теперь все работает правильно. - person CMan; 01.11.2017

Используйте self.storyboard?.instantiateViewController(withIdentifier:kCreateFBAccountVCID) как! DetailVC вместо DetailVC()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let detailView = **self.storyboard?.instantiateViewController(withIdentifier:kCreateFBAccountVCID ) as! DetailVC**
detailView.customInit(detailID: tempViewData[indexPath.section].detailIDs[indexPath.row])
setupTableView.deselectRow(at: indexPath, animated: true)
self.navigationController?.pushViewController(detailView, animated: true)}
person Sandip Gill    schedule 01.11.2017