Переключение между представлениями в NavigationController работает неправильно - PullRequest
0 голосов
/ 21 января 2019

У меня есть приложение, которое включает в себя представление настроек, которое было настроено с использованием UITableView с прототипами ячеек. После заполнения каждая из ячеек ведет на следующую страницу настроек. Эти последующие страницы настроек должны затем позволить пользователю вернуться обратно на главную страницу настроек (и, в конечном итоге, выйти из настроек обратно в главное меню).

Базовая механика каждой страницы настроек работает правильно независимо. Проблема, которую я имею, связывает их все вместе в навигационном потоке.

ПЕРВЫЙ ПОДХОД

Первоначально я закодировал экраны настроек в виде нескольких различных контроллеров представления и создал ручные переходы для каждого контроллера представления из главного экрана настроек (и вручную создал переходы обратно к основному экрану настроек). Основным экраном настроек была визуальная настройка UITableView с прототипами ячеек. Этот подход работал как задумано, но довольно неуклюже с необходимостью вручную кодировать каждый переход на каждом экране.

НОВЫЙ ПОДХОД (который не работает)

Чтобы сделать вещи чище и проще в управлении (с точки зрения кода), я попытался добиться того же эффекта с помощью контроллера навигации с моей страницей основных настроек, встроенной в контроллер навигации (что может быть неправильной терминологией, но по сути главная страница настроек - это то, что вы видите, когда входите в раскадровку через контроллер навигации). Оттуда я подключил главную страницу настроек к каждой вторичной странице настроек, используя segues.

При использовании подхода с навигационным контроллером страница основных настроек загружается правильно и работает правильно (т. Е. Загружается правильный контент, прокручивается таблица, работают переключатели и т. Д.), Но при каждом касании ячейки, что должно вызвать переход к на странице дополнительных настроек кажется, что ничего не происходит ... однако я вижу, что для выбранной страницы дополнительных настроек запущены линии печати, а главная страница настроек просто зависает и перестает работать.

Простая демонстрация основных экранов настроек, ведущая к следующему: https://imgur.com/qnzb36j.png

идентификатор и подробности Segue: https://imgur.com/W3Gn7WS.png

Следующий код используется на главном экране настроек для запуска перехода к экрану таймера (например). И переход к экрану таймера имеет идентификатор «ShowTimerView».

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        print("\(indexPath.row) was selected.")

        if indexPath.row == 1 {
            // Action when timer button pressed
            print("Timer button pressed.")
            print("-----Segueing to Timer view.")
            self.performSegue(withIdentifier: "ShowTimerView", sender: nil)
        }
}

Как было описано ранее, нажатие на ячейку таймера для перехода к экрану таймера приводит к тому, что экран основных настроек перестает отвечать на запросы и экран таймера никогда не появляется. Я могу сказать, что экран таймера загружен / запущен в виде строк печати в пределах ViewController страницы таймера и отображается в терминале.

Я пытался поиграть с разными вещами, чтобы заставить его работать. Я предполагаю, что я делаю глупую ошибку, так как, когда я меняю вид перехода с «Показать» на «Представить модально», экран таймера загружается и появляется ... но панель навигации не загружается, поэтому нет никакой возможности чтобы вернуться к главному экрану настроек.

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

Settings button pressed.
-----Segueing to Settings view.
2019-01-20 20:54:58.979042+0000 ThirtySeconds[14618:388866] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600001f68690 UILabel:0x7fb2a1d636b0'Settings'.top >= UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top   (active)>",
    "<NSLayoutConstraint:0x600001f685a0 UILabel:0x7fb2a1d636b0'Settings'.firstBaseline == UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top + 28   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001f68690 UILabel:0x7fb2a1d636b0'Settings'.top >= UILayoutGuide:0x600000560fc0'TitleView(0x7fb2a1c62740)'.top   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

И затем, когда я нажимаю ячейку Таймера, появляется следующий вывод:

Timer button pressed.
-----Segueing to Timer view.
2019-01-20 20:55:38.339771+0000 ThirtySeconds[14618:388866] [Answers] Logging Answers event: <ANSPredefinedEvent: content_view
{
    "content_id" = "N/A";
    "content_name" = Timer;
    "content_type" = "Settings Screen";
}
{
}>
2019-01-20 20:55:38.359086+0000 ThirtySeconds[14618:389499] [Answers] Logging predefined event to Firebase. <select_content
{
    "content_type" = "Settings Screen";
    "item_id" = "N/A";
    "item_name" = Timer;
}>
2019-01-20 20:55:38.365187+0000 ThirtySeconds[14618:388866] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600001f6ab20 UILabel:0x7fb2a1d73f60'Timer'.top >= UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top   (active)>",
    "<NSLayoutConstraint:0x600001f6a850 UILabel:0x7fb2a1d73f60'Timer'.firstBaseline == UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top + 28   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001f6ab20 UILabel:0x7fb2a1d73f60'Timer'.top >= UILayoutGuide:0x600000561ce0'TitleView(0x7fb2a1c110a0)'.top   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

1 Ответ

0 голосов
/ 22 января 2019

Ах!Оказывается, проблема была в изменениях высоты, которые я сделал в субклассовом навигационном контроллере.Удаление этих изменений приводит к тому, что все работает и ведет себя как ожидалось.

...