首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新到Xcode 11.3.1 - navigationBar和一半的视图在故事板重构后消失

更新到Xcode 11.3.1 - navigationBar和一半的视图在故事板重构后消失
EN

Stack Overflow用户
提问于 2020-01-19 12:50:07
回答 1查看 345关注 0票数 0

使用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的代码:

代码语言:javascript
复制
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扩展:

代码语言:javascript
复制
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就消失了!

以下是概述:

EN

回答 1

Stack Overflow用户

发布于 2020-01-19 14:57:01

我终于找到了解决办法。

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

只有将“第一入口-视图控制器”设置为旧的主-视图控制器,才能产生不同的效果:

这个老主视图控制器(最终将菜单按钮-查看控制器作为它的子)在其viewWillAppear方法中有以下一行:

代码语言:javascript
复制
navigationController?.setNavigationBarHidden(true, animated: animated)

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

故事板的奇怪之处在于:即使将菜单按钮-视图控制器设置为第一项,也不知何故仍然考虑到了前面第一项设置的导航控制器隐藏机制。在我看来,这似乎是一个小错误。我假设可见的navigationBar是默认行为。但是一旦将它设置为隐藏,它就会隐藏起来,即使是强硬的隐藏命令也不再执行。总之,非常奇怪的行为。

通过删除该行--或者更好的--在菜单-Button-ViewController中添加"with line = false“,使NavigationBar再次显示!

我的学习是监视整个应用程序层次结构中的所有navigationController操作或突变。单个ViewController可能会在其navigationController上发生某些突变,这一事实可能还不够。您必须检查事件父-视图控制器或segue-父母以及。最烦人的是,将不同的第一项应用于VC确实要求您覆盖视图的默认行为,以确保视图显示!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59810157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档