web-dev-qa-db-ja.com

Navigation Controllerを使用したTab Barアプリケーション

タブバーと3つのタブがあるシンプルなiPhoneアプリがあります。各タブは、対応するコントローラーを備えた個別のペン先としてロードされます。各ペン先には、検索/フィルタリングなどのための他のコントロールを備えたテーブルビューが含まれています。

私が欲しいのは(そして例を見つけることができないようです)、各ニブ(つまり各タブ)がさらに詳細なページにドリルダウンできるようにアプリにNavigation Controllerを追加することです。

メインウィンドウにNavigation Controllerを追加してIBOutletを作成するか、NCをペン先に追加する必要がありますか。

45
Adrian Collins

XIBにタブバーがある場合、これに最も簡単なアプローチは、UINavigationControllerオブジェクトをライブラリウィンドウ(金色の背景の左ナビゲーションバーボタンのように見える)からタブバーのツリービューにドラッグすることです( GUIではなく、テキストのみのビュー)。 Navigation ControllerをTab Bar Controller内に配置し、Navigation Controller内に既存のView Controllerをドラッグします。

そのタブを表示すると、その上部にナビゲーションバーが表示されます...別のxibからナビゲーションコントローラーを読み込んでいる場合は、タブバーxibのナビゲーションバーを変更します。

これは、NavigationControllerをプログラムで追加する方法です(たとえば、AppDelegateで)

  UIViewController  *viewController1, *viewController2;

    viewController1 = [[[UIViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
    UINavigationController *navigationcontroller = [[[UINavigationController alloc] initWithRootViewController:viewController1] autorelease];

    viewController2 = [[[UIViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigationcontroller, viewController2, nil];

Viewcontroller1にテーブルビューがある場合、self.navigationControllerを使用してNavigationcontrollerにアクセスできます。 didSelectRowAtIndexPathでDetailViewを開きます

例えば。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

この例では、detailViewControllerはNIBファイルで初期化されます。NIBファイルは、戻るボタン付きのナビゲーションバーを追加します。ただし、プログラムでdetailViewControllerを初期化する場合は、UIBarButtonItemにアクション(GoBack)を追加して、NavigationControllerからdetailViewControllerを削除できます。

-(void) GoBack
{    
    [self.navigationController popViewControllerAnimated:YES];
}
27
Max Ballo

私はこれが遅いことに気づきましたが、この質問は今日のグーグルの結果で一番ですので、答えを追加すると思いました。 O'Reillyによる素晴らしいYouTubeビデオチュートリアルがあり、Tabbar + Navigation Controllerアプリについて説明しています。こちらをご覧ください: http://www.youtube.com/watch?v=LBnPfAtswgw

13
dnstevenson

たくさんの答えがありますが、チェックされるものはありません...

もちろん、これはXcodeインターフェイスビルダーのストーリーボードを使用すると、非常に簡単になりました。

目的のNavigation Controllerを作成し、メニューEditorおよび項目Embed In >その後、Tab Bar Controller

これは、新しいプロジェクトのmaster/detail split-view-controllerテンプレートで開始したときにXcodeが表示するNavigation Controllerでも機能しました。どちらの場合も、Tab Bar Controllerをマスターとして使用できます。 iPhoneの場合、エンドコントローラー全体に波及し、iPadの場合、タブはマスターにのみ保持されます(つまり、ランドスケープでは右側の分割、ポートレートではポップオーバー)。

9
john.k.doe

それについて考える方法はこれです:

各タブにNavigation Controllerが必要です。次に、各navコントローラーにルートビューコントローラーと読み込まれたNibが必要です。

そのため、IBでは、各タブにnavコントローラーを追加します。次に、各navコントローラーが適切なルートビューコントローラーとNibを持つように構成します。

9
August
6
Sara

UITabBarControllerのXIBファイルを開きます(MainWindow.xibから)

「タブバーコントローラーの属性」に移動します。そこに「View Controllers」セクションが表示され、各タブのView Controllerが記載されます。必要なタブのコントローラーのタイプをNavigationControllerに変更するだけです。

変更したコントローラーのビューを選択し、その属性でloadFromNibオプションを確認し、正しいnibを選択します。 (コントローラーの種類を変更した後、この接続は失われたはずです)

1
dsaw

質問は古すぎますが、SDKはアップグレードされており、読者によっては新しい回答が必要な場合があります。したがって、ストーリーボードユーザーにとって、TabbarとNavigation Controllerの両方を使用する答えは非常に簡単です。

  1. ストーリーボード内にNavigation Controllerをドラッグします。
  2. コントローラーを開始点として、起動矢印を新しいNavigation Controllerに割り当てます。
  3. Tabbarコントローラーをドラッグし、タブと必要なコントローラーでセットアップします。後で行う場合も、タブを使用してTabbar Controllerをセットアップできます。
  4. Navigation Controllerを選択し、その「ルートViewController」をTabbar Controllerにバインドします。

これにより、アプリケーションにNavigation ControllerとTabView Controllerの両方がロードされます。

0
Paresh Thakor