iOS - 双 UITabBarControllerDelegate 取消行为
iOS - double UITabBarControllerDelegate cancels behavior
我有一个带有 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 正在取消第 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 始终为零。
TabBarController 的委托不必是任何一个视图控制器。它可能是其他一些对象(甚至不是视图控制器),它可能持有对两个视图控制器的弱引用,例如,或者 post 通知等
您似乎在多个地方处理 UITabBarControllerDelegate
回调,为此,您也在多次更改 -
self.tabBarController?.delegate = self
这是你应该做的 -
- 在一处处理
UITabBarControllerDelegate
。
- 从那里向相关屏幕发送必要的工作电话。
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 子类,或者任何其他保证在应用程序生命周期内存在的对象。
我有一个带有 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 正在取消第 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 始终为零。
TabBarController 的委托不必是任何一个视图控制器。它可能是其他一些对象(甚至不是视图控制器),它可能持有对两个视图控制器的弱引用,例如,或者 post 通知等
您似乎在多个地方处理 UITabBarControllerDelegate
回调,为此,您也在多次更改 -
self.tabBarController?.delegate = self
这是你应该做的 -
- 在一处处理
UITabBarControllerDelegate
。 - 从那里向相关屏幕发送必要的工作电话。
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 子类,或者任何其他保证在应用程序生命周期内存在的对象。