6

プロジェクトのカスタム UITabBar ソリューションを実装しました。基本的に、項目が 5 つ以上ある場合は、ユーザーが追加のタブ項目をスクロールできるようにし、[その他] ボタンを非表示にする scrollView を使用します。同様のルック アンド フィールは、Weather Channel アプリでも見ることができます。

各タブ バー アイテムは、各タブのビューのスタックを管理する UINavigationController に対応します。私が抱えている問題は、5 つ以上のタブ項目がある場合、タブ 5 以降ではナビゲーション スタックが正しく維持されないことです。そのタブに戻って最初のページに戻るたびに、moreNavigationController がナビゲーション スタックを強制終了しているようです。

次のように setSelectedViewController メソッドをオーバーライドしました。

- (void) setSelectedViewController:(UIViewController *)selectedViewController {
    [super setSelectedViewController:selectedViewController];
    if ([self.moreNavigationController.viewControllers count] > 1) {
        self.moreNavigationController.viewControllers = [[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil];
    }
}

このコードは、左側のナビゲーション ボタンの [その他] 機能を削除しますが、ナビゲーション スタックの維持の問題は解決しません。他のすべてのタブは正常に機能します。いくつかのビューをたどることができ、そのタブを離れて戻った後もスタックは維持されます。これが複雑な問題であることは理解しています。明確に説明できる領域があれば教えてください。ありがとう!

4

2 に答える 2

6

これが私がこれを修正することになった方法です:

- (void) setSelectedViewController:(UIViewController *) selectedViewController {
    self.viewControllers = [NSArray arrayWithObject:selectedViewController];
    [super setSelectedViewController:selectedViewController];
}

基本的に、UITabBarControllerでviewControllersを最初に設定すると、5以降のタブはナビゲーションコントローラーがmoreNavigationControllerに置き換えられます。したがって、クリックしているタブだけが含まれるようにviewControllersを動的に設定します。この場合、1を超えることはないため、moreNavigationControllerは機能しません。

カスタムコントローラーを初期化するときは、アプリケーションをロードできるように、最初のタブをviewControllersとして指定するだけです。

- (id) init {
    self = [super init];
    if (self) {
        self.delegate = self;
        [self populateTabs];
    }
    return self;
}

- (void) populateTabs {
    NSArray *viewControllers = [self.manager createViewsForApplication];
    self.viewControllers = [NSArray arrayWithObject:[viewControllers objectAtIndex:0]];
    self.tabBar.hidden = YES;
    MyScrollingTabBar *tabBar = [[MyScrollingTabBar alloc] initWithViews:viewControllers];
    tabBar.delegate = self;
    [self.view addSubview:tabBar];
}

わかりやすくするために、tabBarデリゲートはこのクラスに設定されているため、タブのクリックに応答できます。デリゲートメソッドは次のとおりです。

- (void) tabBar:(id) bar clickedTab:(MyScrollingTabBarItem *) tab {
    if (self.selectedViewController == tab.associatedViewController) {
        [(UINavigationController *) tab.associatedViewController popToRootViewControllerAnimated:YES];
    } else {
        self.selectedViewController = tab.associatedViewController; 
    }
    // keep nav label consistent for tab
    self.navigationController.title = tab.label.text;
}
于 2012-05-02T15:56:17.837 に答える