一尘不染

检测何时按下标签栏项目

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 {

}

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


阅读 202

收藏
2020-07-07

共1个答案

一尘不染

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

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

然后,在该类中,重写viewDidLoad,然后在其中将委托属性设置为self:

self.delegate = self

注意:这是在设置选项卡栏控制器委托。标签栏具有自己的委托(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")
}

我猜您可能对后者更感兴趣。查阅文档,以查看每个代理提供的内容。

最后一件事,在您的情节提要中(假设您正在使用情节提要),将标识栏控制器的类设置为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")
}
2020-07-07