Segue и навигационный контроллер взаимодействия - PullRequest
0 голосов
/ 04 мая 2018

У меня настроен переход от контроллера основного вида к контроллеру подробного вида, но когда он отображается, панель навигации остается такой же, как и исходный вид - кнопка «закрыть» и основной заголовок. Я ожидаю увидеть кнопку «Назад» и заголовок для подробного экрана, который я открываю (я установил заголовок в prepareForSegue). Редактор Xcode показывает там кнопку «Назад», которая, по-видимому, запускается при подключении перехода.

Подробнее о настройке:

  • Главный экран - это навигационный контроллер с контроллером вкладок внутри. На двух вкладках отображаются разные данные, но используется один и тот же класс контроллера табличного представления.
  • Каждая вкладка содержит контроллер навигации с контроллером табличного представления.
  • У каждого контроллера табличного представления есть переход Show к контроллеру подробного представления.
  • При касании определенного элемента таблицы контроллер представления таблицы вызывает performSegue(withIdentifier:,sender:)
  • Контроллер табличного представления имеет prepareForSegue для передачи данных в подробный контроллер, и это прекрасно работает: данные отображаются в подробной таблице.

enter image description here

Код prepareForSeque:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
  switch segue.identifier {
    case SegueID.stringList:
      guard let listController = segue.destination as? StringListViewController,
            let indexPath = tableView.indexPathForSelectedRow,
            let stringListField = model.sections[indexPath.section].fields[indexPath.row/2]
                as? ListField<String>
      else { break }

      listController.strings = stringListField.values
      listController.navigationItem.title = stringListField.name
    default:
      break
  }
}

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

Как мне заставить этот подробный вид отображать свой собственный элемент навигации и показывать кнопку Назад?

1 Ответ

0 голосов
/ 04 мая 2018

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

Вы должны использовать TabBarController в качестве корневого контроллера представления (стрелка должна указывать на него), и он не должен быть встроен в стек контроллера навигации, в частности, он не должен быть rootVC навигационного контроллера.

Читать здесь Apple -NavigationController rootViewController

rootViewController Контроллер представления, который находится в нижней части стек навигации. Этот объект не может быть экземпляром Класс UITabBarController.

В ваших комментариях ниже сказано, что вы все переставили, установив tabBarVC как root для приложения (стрелка указывает на него), но он все равно не работает. Трудно определить проблему.

Вы должны использовать операторы print, чтобы выяснить, какой контроллер nav выполняет push, это может помочь вам решить проблему.

override func viewDidLoad() {
    super.viewDidLoad()

    // is this the very navController that has the tabBar as root or is this the one of the other ones?
    print("viewDidLoad: \(navigationController?.viewControllers.description as Any)") // this should print everything currently on the stack
}
...