-1

タブバーコントローラー内で使用しているコンテナーコントローラーを作成しました。コンテナーは のようなコントローラーのスタックを管理します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 に答える