【问题标题】:iOS 13 In Tab Bar child view controller viewWillAppear is not callediOS 13 In Tab Bar子视图控制器viewWillAppear未被调用
【发布时间】:2020-02-07 00:17:12
【问题描述】:

我有一个标签栏控制器,并在其中添加了五个视图控制器,如下所示:

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
}
}

问题是我的第一个控制器,即 findWorkVC,它的 viewWillAppear 被调用,但是当我点击任何其他视图控制器时,它们的 viewWillAppear 没有被调用。

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

【问题讨论】:

    标签: ios swift uinavigationcontroller uitabbarcontroller viewwillappear


    【解决方案1】:

    我创建了一个新项目并测试了所有内容,使用选项卡查看控制器,一切正常,但在我的项目中没有,所以我开始寻找在我的项目中与新创建的项目不同的东西。

    原来,它是根视图控制器。我正在用动画设置这样的根视图控制器

    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,没有动画,一切正常。

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

    现在我只需要寻找如何设置带有动画的根视图控制器。 :|

    【讨论】:

    • 嘿Noor,这有什么新的吗?
    • @StéphanedeLuca 找不到任何解决方案,必须直接设置根视图控制器为全屏演示样式。
    【解决方案2】:

    如果您的演示样式不是 Apple 的新默认设置(表格),那么只需将所有 ViewController(包括 NavigationController)的演示样式设置为全屏即可。这样,每个 VC 都会再次调用 viewWillAppear 方法。

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多