web-dev-qa-db-ja.com

Navigation Controller内のTab Bar Controller、またはNavigationルートビューの共有

私はTweetieアプリのように構造化されたUIを実装しようとしていますが、これはそのように動作します:トップレベルのView ControllerはNavigation Controllerのようです、そのルートビューは「アカウント」テーブルビューです。アカウントをクリックすると、2番目のレベルに移動します。このレベルには、下部にタブバーがあります。各タブ項目には異なるリストが表示され、さらにドリルダウンできます(後続のレベルにはタブバーは表示されません)。

したがって、実装階層は次のようになります。

  • UINavigationController
    1. アカウントUITableViewController
    2. UITabBarController
      1. TweetsUITableViewController
        • ツイート/ユーザー/などの詳細ビュー
      2. 返信UITableViewController
      3. ...

これは動作しているようです[^ 1]が、-pushViewController:animated:のSDKドキュメントによると、サポートされていないようです(強調が追加されました):

viewController:スタックにプッシュされるView Controller。 Tab Bar Controllerのインスタンスにすることはできません。

プライベートAPIなどを回避したいのですが、うまく機能しているように見えても、この使用が明示的に禁止されている理由はわかりません。誰もが理由を知っていますか?

Tabバーコントローラーをメインコントローラーとして配置することを考えました。各タブには個別のNavigationコントローラーが含まれています。これに伴う問題は、各navコントローラーが単一のルートView Controller(つまりTweetieの「Accounts」テーブル)を共有する必要があることです-これは ' tは動作しているようです:テーブルコントローラーを2番目のnavコントローラーにプッシュすると、最初から削除されたようです。別のアカウントを選択する際のすべての簿記は言うまでもなく、おそらく苦痛になるでしょう。

これを正しい方法で実装するにはどうすればよいですか?

[^ 1]:Tab Bar Controllerをサブクラス化して、そのレベルのTab Bar Controllerのナビゲーション項目が選択したタブのNavigation項目と同期し、個々のタブのテーブルコントローラーがそれぞれの詳細ビューをself.tabBarController.navigationControllerにプッシュする必要があるようにする必要がありますself.navigationControllerの。

79
Daniel Dickison

以前の2つの答えは正しかった-TweetieでUITabBarControllerを使用していません。カスタムXXTabBarControllerUIViewControllerのプレーンなサブクラス)を記述するのは非常に簡単です。これはnavコントローラースタックにプッシュしても問題ありませんが、それでも「ビューコントローラー」の哲学に従っています。アカウント固有のビュー(Tweets/Replies/Messages)の各「タブ」は独自のView Controllerであり、懸念される限り、それらはスワップされますプレーンオールUITabBarControllerによって画面上に表示されます。

63
Loren

Tweetieと同様のナビゲーションフレームワークを使用するアプリを作成しています。私はブログでこれを行う方法についての投稿を書いています www.wiredbob.com これはソースコードにもリンクしています。これは、別のプロジェクトの基礎として使用できる完全なテンプレートです。がんばろう!

34
Robert Conn

UITabBarを任意のUIViewControllerに追加することができます。そうすれば、実際にUITabBarControllerをプッシュする必要がないため、Apple API。

インターフェイスビルダーでは、UITabBarはCocoa Touch Libraryの「Windows、Views&Bars」の下にあります。

10

いくつかのアプリでこれを行います。 NavigationControllerベースのアプリにタブバーを追加するコツは、TabBarControllerを使用しないことです。ビューにTab Barを追加し、そのビューのView ControllerをTabBarDelegateにし、View Controllerのコード内のTab Barでのユーザー選択に応答します。

Tab Barを使用して、サブビューとしてTab Barのビューに追加のビューを追加したり、異なるデータセットでテーブルビューを再ロードしたり、UIPickerViewを再ロードしたりします。

9
Alpinista

過去1時間、UITabBarの実装に苦労していました。ビューを表示しようとすると非表示になるためです。それから私はこれを見つけました post

基本的に、次のコード行ごとに、タブバーの下に新しいビューを挿入してください。

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
6
esilver

これは私がやった方法です。これは、実際にはTabbarControllerをNavigation Controllerにプッシュしています。正常に動作します。ドキュメントでAppleはこの方法をサポートしていません。この警告へのリンクを教えてもらえますか?

これが真実である場合、Appleはアプリをアプリストアに公開することを拒否する可能性がありますか?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}
3
savudin

私のアプリでは、ルートビューコントローラーはUINavigationコントローラーです。アプリの特定の時点で、UITabBarを表示する必要があります。以前の投稿の一部が示唆したように、ナビゲーション階層内のUIViewにUITabBarを実装しようとしましたが、これは機能します。しかし、Tab Controllerが提供するデフォルトの動作をもっと必要としていることがわかり、UITabBarControllerをUINavigationコントローラーとともに使用する方法を見つけました。

1)UITabBarControllerのビューを表示したい場合、これを行います:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2)ナビゲーション階層の現在の場所に戻りたい場合、次のようにします。

appDelegate.window.rootViewController = myNavControllerInstance;
3
richardsun

これは、TabBarControllerをNavigation Controllerに埋め込むだけで実現できます。ストーリーボードで:

  1. ViewControllerをドラッグ
  2. ViewControllerのシーンをクリックします
  3. エディター>>埋め込み>> Navigation Controllerをクリックします。
  4. 同じViewController上のボタンをドラッグします。
  5. TabBarControllerをドラッグします
  6. View Segueアクションを介して、ViewControllerのボタンをTabBarControllerに接続します。

この場合、TabBarControllerのRootViewControllerのみがNavigation Controllerのスタックにあります。すべてのTabBarItemの上部にナビゲーションバーがあり、選択したTabBarItemに関係なく、ユーザーはいつでもホーム画面に移動できます。

これは、Navigation Controllerのスタック内の任意のViewControllerで実行できます。

それが機能する場合は、次の回答で画像とコードを投稿できるように、評判を高める方法を提案してください。 :)

2
caffieneToCode

この問題にどのように取り組んだかについてのブログ記事を書きました。私にとって、モーダルビューの使用は、カスタムのタブバー実装を記述するよりも簡単なソリューションでした。

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/

1
Alex Medearis