我有一个根视图控制器,没有将其设置为故事板上的任何视图控制器的自定义类。相反,我所有的视图控制器都将此类子类化。
// 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的子类,即消息未打印。
您不希望视图控制器的基类是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") }