我有一个带有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.
}

切记在viewDidUnloaddealloc中都将自己删除为观察者,因为viewDidUnload可能永远不会被调用。

10-07 19:55
查看更多