我在标签栏控制器中写了一个container controller。容器管理像UINavigationController
这样的控制器堆栈,我希望它的行为方式与导航控制器相同,这样当选项卡被轻击时,容器会弹出到根控制器。
我不正在寻找一个涉及作为标签控制器代表的解决方案;我希望容器的行为与UINavigationController
相同,并且在放入标签控制器时自动执行。
更新:为了回应一些怀疑,我希望可能有一些UITabBarController在UINavigationController上调用的无法记录的方法,我可以实现;但是,登录-respondsToSelector:
是我见过的唯一方法-_appearanceContainer
。但是,将记录置于-isKindOfClass:
会显示正在多个位置对UINavigationController
进行测试。
答案 0 :(得分:1)
我想我找到了办法。我在导航控制器上对此进行了测试,但我认为它也适用于您的自定义控制器。在自定义容器控制器中使用KVO。
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserver:self forKeyPath:@"self.tabBarController.selectedViewController" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([change[@"old"] isEqual:change[@"new"]] && [change[@"new"] isEqual:self]) {
NSLog(@"nav controller's tab was selected again");
}else{
NSLog(@"different tab was selected");
}
}
答案 1 :(得分:0)
看起来rdelmar是正确的 - 虽然可能,但我很确定这会让我的用户因使用私有API而被拒绝。
- (BOOL)isKindOfClass:(Class)aClass
{
if ([aClass isEqual:[UINavigationController class]])
{
if ([[NSThread callStackSymbols] objectAtIndex:1] rangeOfString:@"-[UITabBarController _tabBarItemClicked:]"].location != NSNotFound)
{
return YES;
}
}
return [super isKindOfClass:aClass];
}
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
{
// Do the popping...
}
我希望看到一个符合指导原则的答案,如果有的话。