检测何时按下标签栏项目

Tun*_*nds 42 uitabbarcontroller uitabbar swift

我有一个根视图控制器,它没有被设置为我的故事板上任何视图控制器的自定义类.相反,我的所有视图控制器都是这样的子类.

// RootViewController
class RootViewController: UIViewController, UITabBarDelegate { 

    // This is not getting executed on any of the view controllers
    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        print("ddd")
    }
}

// Subclassing it 
class TopStoriesViewController: RootViewController {

}
Run Code Online (Sandbox Code Playgroud)

但是,当在视图控制器上按下tabbaritem时,我似乎正在努力做某事,该视图控制器是rootviewcontroller的子类,即消息未被打印.

mbe*_*aty 76

您不希望视图控制器的基类成为UITabBarDelegate.如果您这样做,所有视图控制器子类都将是标签栏代理.我认为你想要做的是扩展UITabBarController,如下所示:

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {
Run Code Online (Sandbox Code Playgroud)

然后,在该类中,覆盖viewDidLoad并在其中将委托属性设置为self:

self.delegate = self
Run Code Online (Sandbox Code Playgroud)

注意:这是设置标签栏控制器委托.标签栏有自己的委托(UITabBarDelegate),标签栏控制器管理,您不允许更改.

所以,现在这个类都是UITabBarDelegate(因为UITabBarController实现了该协议)和UITabBarControllerDelegate,你可以根据需要覆盖/实现那些委托的方法,例如:

// UITabBarDelegate
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
    print("Selected item")
}

// UITabBarControllerDelegate
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    print("Selected view controller")
}
Run Code Online (Sandbox Code Playgroud)

我猜你可能对后者更感兴趣.查看文档以了解每个代表提供的内容.

最后,在您的故事板中(假设您使用的是故事板),在Identity Inspector中将标签栏控制器的类设置为MyTabBarController,您就可以开始使用了.

斯威夫特3/4

// UITabBarDelegate
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print("Selected item")
}

// UITabBarControllerDelegate
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    print("Selected view controller")
}
Run Code Online (Sandbox Code Playgroud)


Gul*_*ulz 45

这样做会导致我出错

不允许更改由选项卡栏控制器管理的选项卡栏的委托

这就是我所做的并且有效

  1. 在你ViewController你继承UITabBarControllerDelegate
  2. 在一个.中设置委托 viewDidLoad
  3. 添加功能

例:

class MyClass: UIViewController, UITabBarControllerDelegate {

   func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        let tabBarIndex = tabBarController.selectedIndex
        if tabBarIndex == 0 {
            //do your stuff
        }
   }

   override func viewDidLoad() {
        super.viewDidLoad()
        self.tabBarController?.delegate = self
   }

}
Run Code Online (Sandbox Code Playgroud)

  • 你的viewDidLoad中的@ShahbazAkram添加行:self.tabBarController?.delegate = self (2认同)
  • 如果您的类是在`viewDidLoad`中实现`UITabBarController`,请执行`self.delegate = self`而不是`self.tabController?.delegate = self`。 (2认同)

Sur*_*gch 8

这是@mbeaty的答案版本,带有更多上下文。它是根据我在这里的完整回答改编的。

import UIKit

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // tell our UITabBarController subclass to handle its own delegate methods
        self.delegate = self
    }

    // called whenever a tab button is tapped
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        if let firstVC = viewController as? FirstViewController {
            firstVC.doSomeAction()
        }

        if viewController is FirstViewController {
            print("First tab")
        } else if viewController is SecondViewController {
            print("Second tab")
        }
    }

    // alternate method if you need the tab bar item
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

将此设置为IB中的Tab View Controller的Custom类。

在此处输入图片说明

替代解决方案

  • 只需viewDidLoad在选项卡的视图控制器的方法中执行某些操作即可。看到这个答案


Mar*_*rta 8

斯威夫特 5

要检测是否TarBarItem选择了特定对象,我在自定义中使用它TabBarController

    class MainTabBarController: UITabBarController, UITabBarControllerDelegate {

        override func viewDidLoad() {
            super.viewDidLoad()

            self.delegate = self

        }


   func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        let selectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController)!
        if selectedIndex == 0 {
            print("first tab bar was selected") 
        } else {
            //do whatever
        }
    }

}
Run Code Online (Sandbox Code Playgroud)