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
这样做会导致我出错
不允许更改由选项卡栏控制器管理的选项卡栏的委托
这就是我所做的并且有效
ViewController你继承UITabBarControllerDelegateviewDidLoad例:
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)
这是@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在选项卡的视图控制器的方法中执行某些操作即可。看到这个答案。斯威夫特 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)