0

TabBarController 内に UINavigationController があり、既に選択されている tabBarItem を選択すると、NavigationController がその rootViewController に戻ります。私の知る限り、これは自動的な動作です。

この動作を変更する必要があり、

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

私のプッシュは自動ポップと並行して行われるため、必要なviewControllerを再度プッシュすることは正しく機能しません。

4

2 に答える 2

0

動作を変更する方法はわかりませんが、そのようなデフォルトの動作を台無しにしないことを強くお勧めします. Apple がこの動作を簡単にいじる方法を提供していない場合、それには理由があります。

文字通り、すべてのボイスオーバー ユーザーはジェスチャに依存しており、そのうちの 1 つはタブをダブルタップして rootView に移動することだと思います。これらのデフォルトのジェスチャーのいずれかをいじると、多数の VO ユーザーを怒らせることが保証されます。残念ながら、私はこれを難しい方法で学びました (カスタムの戻るボタンでカスタムのナビゲーション バーを使用する)。

この回答により、要件を再考するよう説得されることを願っています =)

于 2012-08-27T17:49:18.433 に答える
0

解決策は、UINavigationController をサブクラス化し、サブクラスを UITabBarController で使用することです。他にもいくつかの便利な機能を追加しました。

そして、これを行うだけで問題ありません-私のアプリには5つ星があり、誰もそれについて不満を持っていません:

@implementation MyNavigationController

// This suppresses the normal pop to the root view controller
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
{   
    return @[];
}

// Extra: give my base classes some notice this is going to happen
- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    UIViewController *vc = self.topViewController;
    if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
        [vc performSelector:@selector(viewControllerWillBePopped)];
    }

    return [super popViewControllerAnimated:animated];
}

// Extra: let the UIViewController refuse to pop
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    BOOL ret = YES;

    UIViewController *vc;
    for(UIViewController *obj in self.viewControllers) {
        if(obj.navigationItem == item) {
            vc = obj;
            break;
        }
    }

    if ([vc respondsToSelector:@selector(shouldPop)]) {
        NSNumber *retVal = [vc performSelector:@selector(shouldPop)];
        ret = [retVal boolValue];
        if(!ret) return NO;
    }
    return [super navigationBar:navigationBar shouldPopItem:item];
}

@end
于 2012-08-27T21:39:24.797 に答える