Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

Левая сторона — это то, что показывает симулятор iPhone 11 Pro, а правая — иерархия представления отладки:

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

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

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

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

введите здесь описание изображения

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

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 с раскадровкой!

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

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

Как восстановить отсутствующую панель навигации ?????????

введите здесь описание изображения

.

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

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

Если я назначу "first-entry-ViewController" непосредственно ViewController-кнопкой меню, то NavigationBar исчезнет!

Вот обзор:

введите здесь описание изображения


Ответы:


1

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

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

Тот факт, что только установка «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 может что-то изменить в своем navigationController, может быть недостаточным. Вы также должны проверить событие parent-ViewControllers или segue-parents. И что самое неприятное, применение другой первой записи к VC требует, чтобы вы перезаписали поведение ваших представлений по умолчанию, чтобы убедиться, что ваши представления отображаются!

19.01.2020
  • но если он тоже скрыт от раскадровки, то как его снова показать? 02.08.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..