ナビゲーションコントローラー内のタブバーコントローラー、またはナビゲーションルートビューの共有


80

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

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

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

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

viewController:スタックにプッシュされるビューコントローラー。タブバーコントローラーのインスタンスにすることはできません。

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

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

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

[^ 1]:タブバーコントローラーは、そのレベルのタブバーコントローラーのナビゲーションアイテムが選択したタブのナビゲーションアイテムと同期し続けるようにサブクラス化する必要があり、個々のタブのテーブルコントローラーはそれぞれの詳細ビューをself.tabBarController.navigationControllerではなくにプッシュする必要がありますself.navigationController

回答:


63

前の2つの答えはそれを正しくしました-私はUITabBarControllerTweetieでは使用しません。ナビゲーションコントローラースタックにプッシュされることを喜んXXTabBarControllerでいるカスタム(のプレーンサブクラスUIViewController)を作成するのは非常に簡単ですが、それでも「ビューコントローラー」の哲学に従っています。アカウント固有のビュー(Tweets/ Replies/ Messages)の各「タブ」は独自のビューコントローラーであり、それらに関する限り、プレーンなolによって画面上で入れ替えられますUITabBarController


2
カスタムタブバーコントローラークラスは、子コントローラーのnavigationItemプロパティとnavigationControllerプロパティの配管をどのように処理しますか?
bvanderveen 2011

これはiOS5で変更されましたか?ルートコントローラーとしても、UITabBarControllerをUINavigationControllerにあまり問題なく追加できるようです。
sparkFinder 2012年

33

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


10
疑問に思っている人のために、言及されたブログ投稿へのリンクはwiredbob.com/blog/2009/4/20/…–
Anh

@Robert Conn、本当に素晴らしいチュートリアル。私はあなたのコンセプトを使用していますが、何らかの理由で私のtabBarがアクティブではありません。これは、アプリを実装しているときに発生しましたか?
サルセド2011

@ASalcedo:私もこの問題を抱えていましたが、www.wiredbob.comのソースコードで、タブバーアイテムに関連付けられたビューのサイズを縮小する必要があったため、デフォルトの高さサイズ460が大きすぎたことがわかりました。タブバーを使用できるように、タブアイテムに設定されている高さが369であることがわかります。Interface Builderで高さを変更するには、ビューの属性インスペクターでステータス、上部バー、下部バーがすべてnoneに設定されていることも確認する必要があります(すぐにはわかりません)。
Izac 2011

2
ブログの投稿は私にとって死んでいます、誰かがそれをうそをついている可能性はありますか?
Tiago Veloso 2015


10

UITabBarを任意のUIViewControllerに追加することができます。そうすれば、実際にUITabBarControllerをプッシュする必要がないため、AppleAPIのガイドラインの範囲内にとどまります。

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


1
こんにちは!@Himadri Choudhuryは、「したがって、Apple APIのガイドラインの範囲内にとどまる」と説明できますか?それとも参照を提供しますか?このガイドラインがどこに書かれているのかわかりません(それが存在することは間違いありませんが、URLは見つかりません)。どうもありがとうございました
darksider 2012

10

私はいくつかのアプリでこれを行っています。NavigationControllerベースのアプリにタブバーを追加する秘訣は、TabBarControllerを使用しないことです。ビューにタブバーを追加し、そのビューのビューコントローラーをTabBarDelegateにして、ビューコントローラーのコードでタブバーのユーザー選択に応答します。

タブバーを使用して、サブビューとしてタブバーのビューにビューを追加したり、さまざまなデータセットでテーブルビューを再読み込みしたり、UIPickerViewを再読み込みしたりします。


6

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

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

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

おかげで、これは私の消えるタブバーを修正するのに役立ちました。Robert Connが提案したのと同じコードを使用しましたが、2番目のビューに切り替えると、どういうわけかuiタブバーが消えます。
Vijay Katam 2012年

3

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

1)UITabBarControllerのビューを表示したい場合は、次のようにします。

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

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

appDelegate.window.rootViewController = myNavControllerInstance;

3

これは、ナビゲーションコントローラーにTabBarControllerを埋め込むだけで実現できます。ストーリーボード:

  1. ViewControllerをドラッグします
  2. ViewControllerのシーンをクリックします
  3. エディタ>>埋め込み>>ナビゲーションコントローラをクリックします。
  4. 同じViewControllerのボタンをドラッグします。
  5. TabBarControllerをドラッグします
  6. プッシュセグエアクションを介して、ViewControllerのボタンをTabBarControllerに接続します。

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

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

それがうまくいったら、次の答えに画像とコードを投稿できるように、評判を上げる方法を教えてください。:)


3

これが私がやった方法です。これは実際にはタブバーコントローラーをナビゲーションコントローラーに押し込んでいます。それはうまくいきます。アップルがこの方法をサポートしていないことをドキュメントのどこにも見つけられませんでした。誰かが私にこの警告へのリンクを教えてもらえますか?

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

-(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];
}

あなたのUIViewControllersリリースするfogot
Gargoを

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.