iOS - 双 UITabBarControllerDelegate 取消行为

问题描述

我有一个带有 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

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

第 4 个选项卡上的 didSelect 正在取消第一个选项卡上的 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 始终为零。

解决方法

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

,

似乎您正在多个地方处理 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 子类中,如果你有一个,或者任何其他保证在应用程序生命周期内存在的对象。