问题 检测以编程方式设置的UITabBar选定索引/项目更改
我想知道我们如何检测选定的TabBar项目或索引何时更改 什么时候 更改以编程方式完成?
self.tabBarController.selectedIndex = 1;
这两个委托函数仅在用户选择tabBar项时检测更改。当以编程方式完成对selectedIndex的更改时,它不会触发。
func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
println("tabBarController didSelectViewController")
}
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
println("tabBar didSelectItem")
}
6865
2018-06-07 09:57
起源
答案:
以前的答案足以“检测”变化,但是它不会检测到正在按下哪个索引。
func selectItemWithIndex(value: Int) {
self.tabBarControllertabBarController.selectedIndex = value;
self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}
self.selectedIndex 不会立即返回所选索引。要检查正在按下哪个项目,我们需要将项目与我们的tabBarItems进行比较 的UITabBarController
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
if item == (self.tabBar.items as! [UITabBarItem])[0]{
//Do something if index is 0
}
else if item == (self.tabBar.items as! [UITabBarItem])[1]{
//Do something if index is 1
}
}
10
2018-06-08 03:01
在这里的所有答案,如果您继承 UITabBarController
已经,这是一个简单的解决方案,用于所有标签栏更改(用户启动和编程):
// Override selectedViewController for User initiated changes
override var selectedViewController: UIViewController? {
didSet {
tabChangedTo(selectedIndex: selectedIndex)
}
}
// Override selectedIndex for Programmatic changes
override var selectedIndex: Int {
didSet {
tabChangedTo(selectedIndex: selectedIndex)
}
}
// handle new selection
func tabChangedTo(selectedIndex: Int) {}
3
2018-02-25 14:25
除了无法做到,但可以做一些黑客攻击,我相信这将成为这个问题的临时解决方案。
在tabbarcontrollerdelegate的下面方法中,当以编程方式切换选项卡或点击选项卡栏项时,调用此处的内容。
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
toVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaMedium11, NSForegroundColorAttributeName: UIColor.colorAppThemeColor], for: .normal)
fromVC.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.fontFuturaBTBook11, NSForegroundColorAttributeName: UIColor.colorStudentTabText], for: .normal)
return nil
}
1
2018-05-31 09:23
斯威夫特3
这是一个更安全的Swift-3版本,基于上面提出的内容:
func selectItem(withIndex index: Int) {
if let controller = tabBarController,
let tabBar = tabBarController?.tabBar,
let items = tabBarController?.tabBar.items
{
guard index < items.count else { return }
controller.selectedIndex = index
controller.tabBar(tabBar, didSelect: items[index])
}
}
的UITabBarController:
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if let items = tabBar.items {
items.enumerated().forEach { if $1 == item { print("your index is: \($0)") } }
}
}
用法:
selectItem(withIndex: 1)
1
2017-08-03 18:56
我找到了一个可爱的解决方案。感谢Ckouta的想法。
我只是创建一个函数来更改索引并触发UITabBar的didSelectItem的委托协议
func selectItemWithIndex(value: Int) {
self.tabBarControllertabBarController.selectedIndex = value;
self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items as! [UITabBarItem])[value]);
}
用法
selectItemWithIndex(1);
0
2018-06-07 10:53
我只关心标签栏控制器堆栈中的一个VC中的selectedIndex。所以我KVO:来自该VC的tabbarcontroller实例上的ed segmentedIndex。效果很好,没有实际问题。
0
2018-06-01 14:23
在swift中,你可以通过覆盖来实现 selectedIndex
的财产 UITabBarController
。
第一个子类 UITabBarController
并添加以下所有代码。
//Overriding this to get callback whenever its value is changes
override var selectedIndex: Int {
didSet {
handleTabSelection(selectedIndex: selectedIndex)
}
}
还要添加此委托方法 UITabBarControllerDelegate
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
//Tab tapped
guard let viewControllers = tabBarController.viewControllers else { return }
let tappedIndex = viewControllers.index(of: viewController)!
//Tab tapped at tappedIndex
handleTabSelection(selectedIndex: tappedIndex)
}
最后,我们从两个地方调用此方法,以便处理所有案例。
private func handleTabSelection(selectedIndex: Int) {
//Do something on tab selection at selectedIndex
}
0
2018-02-15 18:16