Обновление до Xcode 11.3.1 - панель навигации и половина представлений исчезают после рефакторинга раскадровки - PullRequest
0 голосов
/ 19 января 2020

Использование Xcode 11.3.1, Simulator11.3.1, iPhoneX, Swift5.1.3, iOS13.3,

Мне интересно, почему половина моего приложения внезапно исчезает !! Может быть, это обновление для Xcode 11.3.1 ???

Ниже приведен скриншот иерархии просмотра отладки Xcode.

С левой стороны показано то, что показывает iPhone 11 Pro Simulator и правая сторона - это иерархия представлений отладки:

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

Выделенный синим цветом объект представляет собой пользовательскую панель навигации (состоящую из stackView). Это работало раньше, но не с момента обновления XCode. Я действительно не верю этому. Что может go не так здесь ??

Если это не обновление Xcode, то мой рефакторинг раскадровки также может быть причиной этой потери представления.

До моего рефакторинга рассматриваемый V C был ChildViewController другого ViewController. Теперь это точка входа в приложение. Может ли это изменение принести потери зрения? Я хочу видеть NavigationController с большим заголовком. Но теперь нет NavigationController!

enter image description here

Вот код, который устанавливает панель навигации:

override func viewDidLoad() {
    // set up navigationItem and navigationController look and feeel
    navigationItem.largeTitleDisplayMode = .always
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationController?.set_iOS12_lookAndFeel()
    navigationItem.title = "bluub"
}

И требуется расширение NavigationController:

import UIKit

extension UINavigationController {

    func set_iOS12_lookAndFeel() {
        if #available(iOS 13.0, *) {
            self.keep_iOS12_lookAndFeel()
        } else {
            let attrLargeTitle = AppConstants.FontAttributes.NavBar_LargeTitleTextAttributes
            self.navigationBar.largeTitleTextAttributes = attrLargeTitle
            let attrTitle = AppConstants.FontAttributes.NavBar_TitleTextAttributes
            self.navigationBar.titleTextAttributes = attrTitle
        }
    }

    private func keep_iOS12_lookAndFeel() {
        if #available(iOS 13.0, *) {
            let navBarAppearance = UINavigationBarAppearance()
            navBarAppearance.configureWithDefaultBackground()
            navBarAppearance.backgroundEffect = .init(style: .systemThickMaterialDark)
            navBarAppearance.titleTextAttributes = AppConstants.FontAttributes.NavBar_TitleTextAttributes
            navBarAppearance.largeTitleTextAttributes = AppConstants.FontAttributes.NavBar_LargeTitleTextAttributes
            navBarAppearance.buttonAppearance.normal.titleTextAttributes = AppConstants.FontAttributes.NavBar_ButtonAppearance_Normal
            navBarAppearance.doneButtonAppearance.normal.titleTextAttributes = AppConstants.FontAttributes.NavBar_Done_ButtonAppearance_Normal
            self.navigationBar.standardAppearance = navBarAppearance
            self.navigationBar.scrollEdgeAppearance = navBarAppearance
        }
    }
}

.

---------------- дополнительные выводы ------------ -----------------

После очередного рефакторинга раскадровки я мог вернуть круглые кнопки меню. Тем не менее, LargeTitle-NavigationBar по-прежнему полностью отсутствует.

Честно говоря, в последнем рефакторинге не было никаких новых ограничений или других настроек раскадровки, как раньше. Тот факт, что я выкинул NavigationController и заменил его идентичным новым, а также переназначил одно или другое ограничение меню-кнопки-View, вернул живое нижнее меню. Насколько я могу судить, никакой разницы с предыдущей раскадровкой не было.

Очень досадно, почему раскадровку нужно перерисовывать в основном для правильного рендеринга. Здесь что-то кажется поврежденным, что касается функциональности XCode с раскадровкой!

Но давайте оставим этот разговор.

Мой оставшийся вопрос:

Как я могу вернуть пропавшее Панель навигации ?????????

enter image description here

.

--------- ------- еще одна находка -----------------------------

Если я переназначу "сначала" -entry-ViewController "к старому ViewController, который в конечном итоге добавляет Menu-button-ViewController как ChildViewController -> тогда все работает!

Если я назначу «first-entry-ViewController» непосредственно на Menu-button-ViewController, то панель навигации исчезнет!

Вот обзор:

enter image description here

1 Ответ

0 голосов
/ 19 января 2020

Я наконец-то нашел решение.

Это действительно было связано с моей логин-архитектурой этого приложения.

Тот факт, что только установив "first-entry-ViewController" как старый-Main-ViewController сделал разницу:

Этот старый-Main-ViewController (который в конечном итоге добавляет Menu-button-ViewController в качестве его дочернего элемента) имел следующую строку в методе viewWillAppear:

navigationController?.setNavigationBarHidden(true, animated: animated)

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

Странная вещь с раскадровкой: даже жесткая настройка Menu-button-ViewController в качестве первой записи почему-то все же учитывает механизм скрытия navigationController предыдущая настройка первой записи. Это кажется мне ошибкой внутри раскадровки. Я бы предположил, что видимый навигационный бар является поведением по умолчанию. Но если один раз установить его скрытым, он будет скрыт, даже если команда скрытия больше не выполняется. Во всяком случае, очень странное поведение.

Удаляя эту строку - или, что лучше, - добавляя ее «со скрытым = ложным» в Menu-Button-ViewController, можно снова отобразить панель навигации !!!

Я учусь следить за всеми действиями или мутациями navigationController во всей иерархии приложения. Тот факт, что один ViewController может что-то видоизменять в своем навигационном контроллере, может быть недостаточным. Вы также должны проверить событие parent-ViewControllers или segue-parent. И что самое неприятное, применение другой первой записи к V C требует от вас перезаписать поведение ваших представлений по умолчанию, чтобы обеспечить отображение ваших представлений!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...