使用Xcode 11.3.1,模拟器11.3.1,iPhoneX,SWIFft5.1.3,iOS13.3,
我想知道为什么我的应用程序的一半突然消失了!会不会是对Xcode 11.3.1的更新?
下面显示Xcode Debug视图层次结构的屏幕截图。
左侧是iPhone 11 Pro模拟器显示的,右侧是Debug层次结构:
显然,视图层次结构中有更多的对象(例如底部的圆形按钮)没有显示在模拟器上(也没有显示在物理iPhoneX上)。NavigationBar也完全不见了!
蓝色高亮显示的对象是一个自定义navigationBar (由一个stackView组成)。这以前起了作用,但在Xcode更新之后就不再起作用了。我真的不相信。这里会出什么问题??
如果不是Xcode更新,那么我对故事板的重构也可能是这种视图丢失的原因之一。
在我进行重构之前,所讨论的VC是另一个ViewController的ViewController。现在,它是应用程序的入口点。这一变化会不会给我们带来损失呢?我想看看NavigationController和largeTitle。但是现在根本没有NavigationController了!

下面是设置navigationBar的代码:
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
}
}
}。
-更多的发现
在另一个故事板重构之后,我可以把圆形菜单按钮拿回来。然而,大型仍然完全缺失。
坦率地说,最近的重构没有像以前那样引入任何新的约束或其他情节提要设置。事实上,我踢掉了NavigationController,换成了一个相同的新的,再加上,重新分配了菜单按钮视图的一个或另一个约束,使底部菜单恢复了活力。据我所知,与以前的故事板没有什么不同。
这是非常恼人的,为什么一个故事板需要重新绘制基本上渲染正确。这里似乎有些东西损坏了,因为Xcode功能与故事板有关!
但让我们离开这个话题。
我剩下的问题是:
我怎样才能找回丢失的NavigationBar??

。
如果我将“第一个入口-查看控制器”重新分配到旧的ViewController,最终添加菜单-按钮-查看控制器作为一个ChildViewController ->,那么一切都能工作!
如果我指定“第一个入口-查看控制器”直接作为菜单按钮-查看控制器,那么NavigationBar就消失了!
以下是概述:

发布于 2020-01-19 14:57:01
我终于找到了解决办法。
这确实与我这个应用程序的登录架构有关。
只有将“第一入口-视图控制器”设置为旧的主-视图控制器,才能产生不同的效果:
这个老主视图控制器(最终将菜单按钮-查看控制器作为它的子)在其viewWillAppear方法中有以下一行:
navigationController?.setNavigationBarHidden(true, animated: animated)它的意图实际上是永远不显示自己的navigationBar。而是加载一个ChildViewController,它本身显示自己的navigationBar。
故事板的奇怪之处在于:即使将菜单按钮-视图控制器设置为第一项,也不知何故仍然考虑到了前面第一项设置的导航控制器隐藏机制。在我看来,这似乎是一个小错误。我假设可见的navigationBar是默认行为。但是一旦将它设置为隐藏,它就会隐藏起来,即使是强硬的隐藏命令也不再执行。总之,非常奇怪的行为。
通过删除该行--或者更好的--在菜单-Button-ViewController中添加"with line = false“,使NavigationBar再次显示!
我的学习是监视整个应用程序层次结构中的所有navigationController操作或突变。单个ViewController可能会在其navigationController上发生某些突变,这一事实可能还不够。您必须检查事件父-视图控制器或segue-父母以及。最烦人的是,将不同的第一项应用于VC确实要求您覆盖视图的默认行为,以确保视图显示!
https://stackoverflow.com/questions/59810157
复制相似问题