-1

我编写了一个容器控制器,我在标签栏控制器中使用它。该容器管理着一堆控制器,例如 a UINavigationController,我希望它的行为方式与导航控制器的行为方式相同,以便在已经选择标签的情况下点击该容器时,容器会弹出到根控制器。

不是在寻找涉及成为选项卡控制器代表的解决方案;UINavigationController我希望容器的行为与放入选项卡控制器时的行为相同并自动执行。

更新:为了回应一些怀疑,我希望 UITabBarController 可以在 UINavigationController 上调用一些未记录的方法,我可以实现它;但是,在-respondsToSelector:我见过的唯一方法中加入了日志记录是-_appearanceContainer. 但是,登录-isKindOfClass:表明它正在UINavigationController多个地方进行测试。

4

2 回答 2

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");
    }
}
于 2013-05-10T18:49:11.037 回答
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...
}

如果有的话,我很想看到一个符合指导方针的答案。

于 2013-05-10T18:47:16.563 回答