我可以检测控制器选项卡上的分接头而不是其代理吗?

时间:2013-05-10 17:03:52

标签: ios uinavigationcontroller uitabbarcontroller

我在标签栏控制器中写了一个container controller。容器管理像UINavigationController这样的控制器堆栈,我希望它的行为方式与导航控制器相同,这样当选项卡被轻击时,容器会弹出到根控制器。

正在寻找一个涉及作为标签控制器代表的解决方案;我希望容器的行为与UINavigationController相同,并且在放入标签控制器时自动执行。

更新:为了回应一些怀疑,我希望可能有一些UITabBarController在UINavigationController上调用的无法记录的方法,我可以实现;但是,登录-respondsToSelector:是我见过的唯一方法-_appearanceContainer。但是,将记录置于-isKindOfClass:会显示正在多个位置对UINavigationController进行测试。

2 个答案:

答案 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...
}

我希望看到一个符合指导原则的答案,如果有的话。