私はTweetieアプリのように構造化されたUIを実装しようとしていますが、これはそのように動作します:トップレベルのView ControllerはNavigation Controllerのようです、そのルートビューは「アカウント」テーブルビューです。アカウントをクリックすると、2番目のレベルに移動します。このレベルには、下部にタブバーがあります。各タブ項目には異なるリストが表示され、さらにドリルダウンできます(後続のレベルにはタブバーは表示されません)。
したがって、実装階層は次のようになります。
UINavigationController
UITableViewController
UITabBarController
UITableViewController
UITableViewController
これは動作しているようです[^ 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
の。
以前の2つの答えは正しかった-TweetieでUITabBarController
を使用していません。カスタムXXTabBarController
(UIViewController
のプレーンなサブクラス)を記述するのは非常に簡単です。これはnavコントローラースタックにプッシュしても問題ありませんが、それでも「ビューコントローラー」の哲学に従っています。アカウント固有のビュー(Tweets
/Replies
/Messages
)の各「タブ」は独自のView Controllerであり、懸念される限り、それらはスワップされますプレーンオールUITabBarController
によって画面上に表示されます。
Tweetieと同様のナビゲーションフレームワークを使用するアプリを作成しています。私はブログでこれを行う方法についての投稿を書いています www.wiredbob.com これはソースコードにもリンクしています。これは、別のプロジェクトの基礎として使用できる完全なテンプレートです。がんばろう!
UITabBarを任意のUIViewControllerに追加することができます。そうすれば、実際にUITabBarControllerをプッシュする必要がないため、Apple API。
インターフェイスビルダーでは、UITabBarはCocoa Touch Libraryの「Windows、Views&Bars」の下にあります。
いくつかのアプリでこれを行います。 NavigationControllerベースのアプリにタブバーを追加するコツは、TabBarControllerを使用しないことです。ビューにTab Barを追加し、そのビューのView ControllerをTabBarDelegateにし、View Controllerのコード内のTab Barでのユーザー選択に応答します。
Tab Barを使用して、サブビューとしてTab Barのビューに追加のビューを追加したり、異なるデータセットでテーブルビューを再ロードしたり、UIPickerViewを再ロードしたりします。
過去1時間、UITabBar
の実装に苦労していました。ビューを表示しようとすると非表示になるためです。それから私はこれを見つけました post :
基本的に、次のコード行ごとに、タブバーの下に新しいビューを挿入してください。
[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
これは私がやった方法です。これは、実際には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];
}
私のアプリでは、ルートビューコントローラーはUINavigationコントローラーです。アプリの特定の時点で、UITabBarを表示する必要があります。以前の投稿の一部が示唆したように、ナビゲーション階層内のUIViewにUITabBarを実装しようとしましたが、これは機能します。しかし、Tab Controllerが提供するデフォルトの動作をもっと必要としていることがわかり、UITabBarControllerをUINavigationコントローラーとともに使用する方法を見つけました。
1)UITabBarControllerのビューを表示したい場合、これを行います:
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;
2)ナビゲーション階層の現在の場所に戻りたい場合、次のようにします。
appDelegate.window.rootViewController = myNavControllerInstance;
これは、TabBarControllerをNavigation Controllerに埋め込むだけで実現できます。ストーリーボードで:
この場合、TabBarControllerのRootViewControllerのみがNavigation Controllerのスタックにあります。すべてのTabBarItemの上部にナビゲーションバーがあり、選択したTabBarItemに関係なく、ユーザーはいつでもホーム画面に移動できます。
これは、Navigation Controllerのスタック内の任意のViewControllerで実行できます。
それが機能する場合は、次の回答で画像とコードを投稿できるように、評判を高める方法を提案してください。 :)
この問題にどのように取り組んだかについてのブログ記事を書きました。私にとって、モーダルビューの使用は、カスタムのタブバー実装を記述するよりも簡単なソリューションでした。
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/