我有一个带有UITabBar
的IOS应用,并将其委托设置为我的班.. didSelectTabBarItem
正确触发了,世界一切正常。但是,当选择的UITabBarItem
在一个特定的UITabBarItem
IE之后时,我确实有一些条件代码发生。如果用户单击选项卡栏项目3,而他们当前在选项卡栏项目2上,则我必须做一些额外的代码,如果用户选择了选项卡栏项目3且以前位于选项卡栏项目1上,我就不必这样做。
因此,是否仍以编程方式存在(除了通过状态变量通过我的程序直接跟踪外,还不知道在选择新的标签栏项目时,先前选择的项目在标签栏上是什么吗?
最佳答案
是的,可以通过键值观察(KVO
)。
note 这个答案是关于UITabBar
而不是UITabBarController
的。标签栏控制器代表有您要查找的方法(如rdelmar所述)。
首先,请观察您的标签栏,如下所示:
- (void)viewDidLoad{
[super viewDidLoad];
[self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}
我想您已经可以通过使用新旧选项来查看我要去的地方。然后,只需观察更改,而不是使用委托方法,如下所示:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){
UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing.
// The change dictionary will contain the previous tabBarItem for the "old" key.
UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey];
NSUInteger was = [bar.items indexOfObject:wasItem];
// The same is true for the new tabBarItem but it will be under the "new" key.
UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey];
NSUInteger is = [bar.items indexOfObject:isItem];
NSLog(@"was tab %i",was);
NSLog(@"is tab %i",is);
}
// handle other observings.
}
切记在
viewDidUnload
和dealloc
中都将自己删除为观察者,因为viewDidUnload
可能永远不会被调用。