2012-02-15 50 views
1

我有UITabbarCoo = ntroller应用程序。我添加了一个观察者,我正在等待任何通知。当我触摸tabbar项目时,我没有收到任何通知。当我触及Tabbar项目时,我没有收到任何通知

[self.tabBarController addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew context:@"changedTabbarIndex"]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
NSString *action = (NSString*)context; 
if([action isEqualToString:@"changedTabbarIndex"]) 
    { 
    } 
} 
+0

这不直接回答你的问题,但是有没有一个原因你不能直接声明自己是UITabBarController的委托并实现“tabBarController:didSelectViewController:”来响应所选的视图控制器更改? – nickbona 2012-02-15 14:20:50

+0

好吧,就其中之一而言,“当代码以编程方式更改标签栏内容时不会调用它”。不需要分开处理是很方便的。 – 2013-07-29 19:33:34

回答

3

我注意到了同样的事情。我认为这是UITabBarController实现中的一个错误。请注意,使用selectedViewController而不是selectedIndex的键路径确实会导致KVO通知被触发。

但要小心。如果您的UITabBarController具有UIMoreNavigationController(对于“更多”选项卡),当用户选择“更多”选项卡时,您将收到KVO通知,但当用户选择子视图控制器时,将不会的UIMoreNavigationController。这是因为UIMoreNavigationController是一个独立的视图控制器,所以当你选择它的子视图控制器之一,该的UITabBarController的selectedViewController没有改变 - 它实际上是UIMoreNavigationController的topViewController改变。

这将是巨大的,如果你可以再观察UIMoreNavigationController的topViewController财产除的UITabBarController的selectedViewController属性,但这个属性似乎并没有引起KVO通知被解雇两种。但是,您可以在上设置UIMoreNavigationController上的委托并实施navigationController:didShowViewController:animated:方法。

摘要:观察的UITabBarController的selectedViewController财产,如果你的应用程序有一个“更多”选项卡,设置选项卡栏控制器的moreNavigationController财产的委托。

+0

http://openradar.appspot.com/radar?id=1588404 – erikprice 2012-03-08 16:39:50

+0

注:更改标签编程似乎没有引起KVO通知被解雇,要么。 – 2013-07-29 19:37:20

+0

@croald这很标准。当以编程方式修改属性时,KVO通知不会触发许多UIKit视图/视图控制器属性。一般来说,这是因为你已经知道属性被修改。有时候这很痛苦,但它确实阻止了某些反馈循环。 – erikprice 2013-07-30 18:35:35

相关问题