0

使用 Xcode 11.3.1、Simulator11.3.1、iPhoneX、Swift5.1.3、iOS13.3、

我想知道为什么我的应用程序的一半突然消失了!会不会是 Xcode 11.3.1 的更新???

下面显示了 Xcode 调试视图层次结构的屏幕截图。

左侧是 iPhone 11 Pro Simulator 显示的内容,右侧是 Debug View Hierarchy:

显然,视图层次结构中有更多对象(例如底部的圆形按钮)没有显示在模拟器上(也没有显示在物理 iPhoneX 上)。导航栏也完全丢失了!!!!

蓝色突出显示的对象是自定义导航栏(由 stackView 组成)。这在 Xcode 更新之前有效,但在 Xcode 更新之后无效。我真的不相信这一点。这里可能出了什么问题?

如果不是 Xcode 更新,那么我对情节提要的重构也可能是导致这种视图丢失的原因。

在我重构之前,有问题的 VC 是另一个 ViewController 的 ChildViewController。现在,它是应用程序的入口点。这种变化会带来视野损失吗?我想看一个带有 largeTitle 的 NavigationController。但是现在没有任何 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 并用一个相同的新控制器替换了它,再加上重新分配了菜单按钮视图的一个或另一个约束,确实让底部菜单恢复了活力。据我所知,与之前的故事板没有区别。

为什么故事板需要重新绘制才能正确渲染,这很烦人。对于带有情节提要的 Xcode 功能,这里似乎有些损坏!

但是让我们离开这个话题。

我剩下的问题:

我怎样才能找回丢失的 NavigationBar ?????????

在此处输入图像描述

.

---------------- 另一个发现 -----------------------------

如果我将“first-entry-ViewController”重新分配给旧的 ViewController,最终将 Menu-button-ViewController 添加为 ChildViewController --> 那么一切正常!

如果我直接将“first-entry-ViewController”指定为 Menu-button-ViewController,那么 NavigationBar 就会消失!

这是概述:

在此处输入图像描述

4

1 回答 1

0

我终于找到了解决方案。

它确实与我的这个应用程序的登录架构有关。

事实上,只有将“first-entry-ViewController”设置为 old-Main-ViewController 才会有所作为:

这个旧的 Main-ViewController(最终将 Menu-button-ViewController 添加为其子项)在其viewWillAppear方法中确实具有以下行:

navigationController?.setNavigationBarHidden(true, animated: animated)

它的意图实际上是永远不会显示它自己的导航栏。而是加载一个 ChildViewController,它本身显示一个自己的 navigationBar。

故事板的奇怪之处在于:即使将 Menu-button-ViewController 设置为第一个条目,在某种程度上仍然会考虑先前第一个条目设置的导航控制器隐藏机制。这对我来说似乎是故事板内部的一个错误。我会假设可见的导航栏是默认行为。但是一旦将它设置为隐藏,它就会隐藏起来,即使很难隐藏命令也不再执行。无论如何,非常奇怪的行为。

通过消除该行 - 或者更好 - 通过在 Menu-Button-ViewController 中添加“with hidden = false”,使 NavigationBar 再次显示!

我的学习是关注整个 App 层次结构中的所有 navigationController 操作或突变。单个 ViewController 可能会改变其 navigationController 上的某些内容这一事实可能还不够。您还必须检查事件 parent-ViewControllers 或 segue-parents。最烦人的是,对 VC 应用不同的第一个条目确实需要您覆盖视图的默认行为以确保显示您的视图!

于 2020-01-19T14:57:01.300 回答