iOS: 如何通过单击 tabBarItem 的第 3 个索引打开 tabBarItem 的第 0 个索引
iOS: How to open 0th Index of tabBarItem by clicking 3rd index of tabBarItem
我的 UITabBarController
中有 5 个 tabBarItem
一种情况,我必须通过单击第三个 UITabBarItem
打开 UITabBarItem
的第一个索引
我的做法如下:
extension FiveTabbarController: UITabBarControllerDelegate {
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if item == (self.tabBar.items!)[2] {
tabBar.selectedItem = (self.tabBar.items!)[0] // ERROR
self.selectedIndex = 0 // NOT WORKING
}
}
}
Error: *** Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason:
'Directly modifying a tab bar managed by a tab bar controller is not allowed.'
请指导我如何实现这一目标。
您可以通过以下方式实现该行为:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if selectedIndex == 2 {
self.selectedIndex = 0
}
}
错误的原因是你不应该修改selectedItem,只能修改索引。通过修改索引,选项卡栏控制器将设置 selectedItem。
已编辑
没有注意到你使用的是 tabBar 的方法而不是 tabbarcontroller 的方法。
您不希望视图控制器的基础 class 成为 UITabBarDelegate。如果你这样做,你所有的视图控制器子 classes 都将是标签栏委托。我认为您想做的是扩展 UITabBarController
class FiveTabbarController: UITabBarController, UITabBarControllerDelegate {
然后,在 class 中覆盖 viewDidLoad 并在那里将委托 属性 设置为 self:
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
现在这个 class 既是 UITabBarDelegate(因为 UITabBarController 实现了该协议),也是 UITabBarControllerDelegate,您可以根据需要 override/implement 这些委托的方法,例如:
extension FiveTabbarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if let getSelectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController), getSelectedIndex == 2 {
self.selectedIndex = 0
}
}
}
我的 UITabBarController
中有 5 个 tabBarItem
一种情况,我必须通过单击第三个 UITabBarItem
UITabBarItem
的第一个索引
我的做法如下:
extension FiveTabbarController: UITabBarControllerDelegate {
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if item == (self.tabBar.items!)[2] {
tabBar.selectedItem = (self.tabBar.items!)[0] // ERROR
self.selectedIndex = 0 // NOT WORKING
}
}
}
Error: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Directly modifying a tab bar managed by a tab bar controller is not allowed.'
请指导我如何实现这一目标。
您可以通过以下方式实现该行为:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if selectedIndex == 2 {
self.selectedIndex = 0
}
}
错误的原因是你不应该修改selectedItem,只能修改索引。通过修改索引,选项卡栏控制器将设置 selectedItem。
已编辑 没有注意到你使用的是 tabBar 的方法而不是 tabbarcontroller 的方法。
您不希望视图控制器的基础 class 成为 UITabBarDelegate。如果你这样做,你所有的视图控制器子 classes 都将是标签栏委托。我认为您想做的是扩展 UITabBarController
class FiveTabbarController: UITabBarController, UITabBarControllerDelegate {
然后,在 class 中覆盖 viewDidLoad 并在那里将委托 属性 设置为 self:
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
现在这个 class 既是 UITabBarDelegate(因为 UITabBarController 实现了该协议),也是 UITabBarControllerDelegate,您可以根据需要 override/implement 这些委托的方法,例如:
extension FiveTabbarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if let getSelectedIndex = tabBarController.viewControllers?.firstIndex(of: viewController), getSelectedIndex == 2 {
self.selectedIndex = 0
}
}
}