【问题标题】:iOS - double UITabBarControllerDelegate cancels behavioriOS - 双 UITabBarControllerDelegate 取消行为
【发布时间】:2021-08-29 05:54:21
【问题描述】:

我有一个带有 4 个底部选项卡的 Swift 应用程序。在主页选项卡中,我正在运行一个视频。在第 4 个标签中,我有一个收藏夹列表。

当用户更改标签时,如果他在主屏幕上,则视频应该停止。此外,当用户点击第 4 个选项卡时,收藏夹列表应该会更新,以便用户可以看到最近添加的内容。

我在主页选项卡视图控制器上有以下内容:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    print("TAB CHANGED")
    if let jwp = jwPlayer {
        jwp.stop()
    }
}

这个在收藏夹标签视图控制器上:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    let tabBarIndex = tabBarController.selectedIndex
    
    if tabBarIndex == 3 {
        let userId = UserDefaults.standard.integer(forKey: "userId")
        favoritesVC.updateData(with: userId)
    }
}

两者都符合 UITabBarControllerDelegate。两者都包括:

self.tabBarController?.delegate = self

当我启动应用程序时,视频开始播放,我点击任何标签,视频就会停止。无论我点击哪个标签,我都会看到“标签已更改”消息。但是,一旦我点击收藏选项卡并移至另一个选项卡,我就不再看到“选项卡已更改”消息。如果我随后移至主屏幕并播放视频,然后移至其他选项卡,则视频不再停止。

第 4 个选项卡上的 didSelect 正在取消第 1 个选项卡上的 didSelect。

我怎样才能让它们都工作?我已将它们放在两个视图控制器上,因为在第一个视图控制器上我需要参考视频,而在第二个视图控制器上我需要参考列表视图控制器(第四个视图控制器实际上有两个顶部选项卡,它们在收藏夹 vc 和下载vc)。

更新:

我将委托移至 TabBarController 子类。我添加了以下内容:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    let tabBarIndex = tabBarController.selectedIndex

    let hvc = HomeViewController()
    if tabBarIndex != 0 {
        hvc.stopPlayer()
    }
}

我加了

delegate = self

class TabBarViewController: UITabBarController, UITabBarControllerDelegate {

在 HomeViewController 我添加了这个:

func stopPlayer() {
    print("TAB CHANGED")
    if let jwp = jwPlayer {
        jwp.stop()
    }
}

但是,当我更改选项卡时,jwPlayer 始终为零。

【问题讨论】:

    标签: ios swift delegates uitabbarcontroller


    【解决方案1】:

    您似乎在多个地方处理 UITabBarControllerDelegate 回调,为此,您还要多次更改 -

    self.tabBarController?.delegate = self
    

    这是你应该做的 -

    1. 在一处处理UITabBarControllerDelegate
    2. 将必要的工作电话从那里发送到相关屏幕。
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    
       if tabBarIndex == 0 {
           homeVC.startPlayer()
       }
       else {
           homeVC.stopPlayer()
           
           if tabBarIndex == 3 {
               let userId = UserDefaults.standard.integer(forKey: "userId")
               favoritesVC.updateData(with: userId)
           }
        }
    }
    

    这可以在任何地方处理,如果你有一个 TabBarController 子类,或者在应用程序生命周期内保证存在的任何其他对象。

    【讨论】:

    • 您能检查一下我添加的更新吗?我尝试了你的建议,但它不起作用。
    • let hvc = HomeViewController() 是该屏幕的全新实例,而不是您在屏幕上看到的实例。您需要在屏幕上当前可见的现有实例上调用该方法。
    • 如何引用现有实例?
    • 也许 - tabBarController.viewControllers.first as? HomeViewController(tabBarController.viewControllers.first as? UINavigationController)?.viewControllers.first as? HomeViewController
    • 谢谢,我结束了在 TabBarViewController 中创建 viewControllers 属性,并且成功了。
    【解决方案2】:

    TabBarController 的委托不必是任何一个视图控制器。例如,它可能是一些其他对象(甚至不是视图控制器)可以持有对两个视图控制器的弱引用,或者发布通知等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多