web-dev-qa-db-ja.com

Interface Builderでナビゲーションコントローラーを追加するにはどうすればよいですか?

1。ステップ:新しいUIViewControllerを作成します:
-Xcode->新しいファイル...-> CocoaTouchクラス-> UIViewController
-名前:MyViewController

2。ステップ:「ナビゲーションコントローラー」(UINavigationController)をライブラリからMyViewController.xibにドラッグアンドドロップします

alt text

.Step:確かに、ナビゲーションコントローラーを正しく接続するために何かしなければなりませんね。

4.Step:新しいViewControllerをモーダルダイアログとして起動してみてください。

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
[self.navigationController presentModalViewController: myViewController animated:YES]; 

結果: "navContr:nil"

5.Step:新しいモーダルビュー(MyViewController)を表示できますが、NavigationControllerとUINavigationBarはありません。

手伝ってくれてありがとうございます!


更新1:

6.Step:新しいUIViewController(ViewNavi2)を「ルートビューコントローラー」として設定しました。
alt text

7.Step: MyViewControllerクラスでIBOutlet UINavigationController *navigationControllerを定義し、xibを構成します:ナビゲーションコントローラー->接続->アウトレットの参照

しかし、私のナビゲーションコントローラーはまだゼロです:-(

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
NSLog(@"navContr: %@", myViewController.navigationController);
// -> "navContr: nil"
13
Manni

ナビゲーションコントローラーもNIBファイルに含めたかったのですが、Appleのドキュメントには、実際にその方法を説明せずに「最適ではない」と書かれていました。メインのタブが必要でした。ナビゲーションコントローラーをプログラムで定義せずに、一般的なナビゲーションコントロールを含むモーダルウィンドウを呼び出すウィンドウ。その方法を共有します。

MyViewControllerでIBOutlet UINavigationController *navigationControllerも定義したので、あなたのコードは私のものと非常に似ていました。 Interface Builderから、ルートビューコントローラーでビューを定義し、ファイルの所有者->ビューをそのビュー定義に設定するだけです。

そして、あなたのコードと同様に、私は私の親ウィンドウで次のことをしました:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self presentModalViewController:myViewController animated:YES];

(自分でpresentModelViewControllerを呼び出していますが、なぜself.navigationControllerがあったのかわかりません。)これをテストした結果、ビューはNIBファイルから読み込まれましたが、ナビゲーションバーがありませんでした。 MyViewControllerのもう1行のコードで、これが修正されました。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setView:myNavigationController.view];

}

ここで行っているのは、ナビゲーションコントローラーを含むNIBファイルで定義されたすべてのものを含むmyNavigationController.viewを指すようにMyViewControllerのビューを設定することだけです。

15
Henry

XCodeの「ナビゲーションベースのアプリケーション」のテンプレートを見てください。 (新しいプロジェクト->ナビゲーションベースのアプリケーション)次に、InterfaceBuilderでMainWindow.xibを開きます。ビューではありませんが、手順1で作成したビューコントローラーと考えてください。次に、インスペクターで参照されている「ルートビューコントローラー」を見て、の「ルートビューコントローラー」ペン先にどのように接続されているかを確認します。属性インスペクターとIDインスペクターの「RootViewController」クラス。

表示するコンテンツを、ナビゲーションのルートにあるバージョンの「RootViewController」に配置することをお勧めします。通常、次に表示されるコントローラーは「DetailViewController」です。繰り返しになりますが、テンプレートが提供するサンプルコードを読むと、その開始方法がわかります。 RootViewController.mのサンプルテンプレートのdidSelectRowAtIndexPathにあるコメント付きコードを見てください。 DetailViewControllerとして機能する独自のViewControllerを作成する必要があります。

うまくいけば、これはあなたのために物事をクリアするでしょう。

//コメントに基づいて編集//
Appleドキュメントによると、ナビゲーションコントローラーを作成するためにIBを使用する場合は、実際にそれらをMainWindow.xibに配置する必要があります。私はそれができないという事実をいじくり回していました。 UIViewオブジェクトのサブビューとしてNavigationControllerを使用します。開始した場所でできることは、IBを使用してナビゲーションバーオブジェクトをView Controllerに追加し、そこから制御することです。

Appleドキュメントから)メインのnibファイル(または他のnibファイル)からスタンドアロンまたはモーダルで表示されるナビゲーションコントローラーをロードすることもできますが、そうすることは最適ではありません。これらのシナリオでは、通常、使用時にプログラムでナビゲーションコントローラを作成する方が簡単です。」

//その他の編集// XCode4では、プロジェクトテンプレートは「マスター詳細」プロジェクトと呼ばれるようになりました。これは、iPadではスプリットビューコントローラーとしてセットアップされますが、iPhoneでは通常のナビゲーションプロジェクトであるためです。答えの中で「RootViewController」を参照すると、「MasterViewController」と呼ばれるものが見つかります。

2
Walter

次のコードは、有効なオブジェクトを提供しません。

NSLog(@"navContr: %@", myViewController.navigationController);

その理由は、UIViewControllerのnavigationControllerプロパティが View Controllerがスタックにある場合にのみNavigation Controllerを返します。NavigationControllerが見つからない場合、このプロパティはnilです。 ViewControllerがのスタックにないためです。ナビゲーションコントローラー。とにかく、ナビゲーションコントローラーを正しく初期化したかどうかさえわかりません。いくつかのドキュメントを読んでください。

0
Oleg Danu