iOS 13 在选项卡栏 subview Controller viewWillAppear 不被调用

标签 ios swift uinavigationcontroller uitabbarcontroller viewwillappear

我有一个选项卡栏 Controller ,并且在其中添加了五个 View Controller ,如下所示:

class InfluencerMainTabBarController: UITabBarController {
override func viewDidLoad() {
    super.viewDidLoad()

    let findWorkVC = UINavigationController.init(rootViewController: InfluencerFindWorkVC.instantiate(fromAppStoryboard: .Influencer))
    findWorkVC.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "ic_home"), tag: 0)

    let inboxVC = UINavigationController.init(rootViewController: InfluencerInboxVC.instantiate(fromAppStoryboard: .Inbox))
    inboxVC.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "ic_inbox"), tag: 1)

    let workDiaryVC = UINavigationController.init(rootViewController: InfluencerWorkDiaryVC.instantiate(fromAppStoryboard: .Influencer))
    workDiaryVC.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "ic_work"), tag: 2)

    let notificationsVC = InfluencerNotificationsVC.instantiate(fromAppStoryboard: .Influencer)
    notificationsVC.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "ic_notification"), tag: 3)

    let accountVC = InfluencerProfileVC.instantiate(fromAppStoryboard: .Influencer)
    accountVC.tabBarItem = UITabBarItem(title: nil, image: #imageLiteral(resourceName: "ic_profile"), tag: 4)

    let tabBarList = [findWorkVC, inboxVC, workDiaryVC, notificationsVC, accountVC]

    viewControllers = tabBarList

    self.tabBar.tintColor = UIColor.appPurpleColor
    self.tabBar.barTintColor = UIColor.white
}
}

问题是我的第一个 Controller ,即 findWorkVC,它的 viewWillAppear 被调用,但是当我单击任何其他 View Controller 时,它们的 viewWillAppear 没有被调用。

它在 iOS 13 设备上运行良好,但在 iOS 13 上它不仅被调用,而且导航栏的高度小于 iOS 12 的导航栏高度,您可以看到导航栏中的标题恰好与状态栏重叠文本。

enter image description here

最佳答案

我创建了一个新项目并测试了所有内容,使用选项卡查看 Controller ,所有内容都在那里工作,但不在我的项目中,所以我开始寻找我的项目中与新创建的项目不同的东西。

事实证明,它是 Root View Controller 。我正在像这样用动画设置 Root View Controller

let controller = InfluencerMainTabBarController.instantiate(fromAppStoryboard: .Main)

UIView.transition(from: self.view, to: controller.view, duration: 0.6, options: [.transitionFlipFromTop], completion: { completed in
     UIApplication.shared.keyWindow?.rootViewController = controller
})

因此,我只是使用 modalPresentationStyle = .fullScreen 呈现 View Controller ,没有动画,一切正常。

let controller = InfluencerMainTabBarController.instantiate(fromAppStoryboard: .Main)
controller.modalPresentationStyle = .fullScreen
DispatchQueue.main.async { UIApplication.shared.keyWindow?.rootViewController = controller }

现在我只需要寻找如何使用动画设置 Root View Controller 。 :|

关于iOS 13 在选项卡栏 subview Controller viewWillAppear 不被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307887/

相关文章:

swift - 在类上定义存储类型属性

iphone - 在 Xcode 中以编程方式按下 UITabBar 按钮

ios - SKSpriteNode 弹跳我没有在 Swift 中创建的东西

ios - 无需点击即可检测 UIWebView 链接

swift - 是否可以在 swift 的 map 函数中使用模式匹配?

objective-c - RestKit 破坏了存档模式下的构建 - Xcode 8

ios - 如何使用透明模式推送 View Controller ?

ios - 当 ViewController 不在窗口层次结构中时不显示警报

ios - 配置非续订订阅的持续时间

jquery - 使用 jQuery Mobile(iPhone 4 上的移动 Safari)在 HTML5 网络应用程序上首次显示隐藏图像时出现黑色闪烁