我有UITabbarCoo = ntroller应用程序。我添加了一个观察者,我正在等待任何通知。当我触及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 :(得分:3)
我注意到了同样的事情。我假设这是UITabBarController实现中的一个错误。请注意,使用selectedViewController
而不是selectedIndex
的密钥路径会导致触发KVO通知。
但要小心。如果您的UITabBarController有一个 UIMoreNavigationController (对于“更多”标签),当用户选择“更多”标签时,您将收到KVO通知,但将不会当用户选择UIMoreNavigationController的子视图控制器时,获取任何通知。这是因为UIMoreNavigationController是一个单独的视图控制器,所以当你选择一个子视图控制器时,UITabBarController的selectedViewController
没有改变 - 它实际上是UIMoreNavigationController的topViewController
发生变化。
如果您可以在UITabBarController的topViewController
属性之外观察UIMoreNavigationController的selectedViewController
属性,那将是很棒的,但是此属性似乎也不会导致KVO通知被触发。但是,可以在UIMoreNavigationController上设置委托并实现navigationController:didShowViewController:animated:
方法。
摘要:观察UITabBarController的selectedViewController
属性,如果您的应用程序有“更多”标签,请在标签栏控制器的moreNavigationController
属性上设置委托。