0

UINavigationController の使用をよりよく理解したいと思います。

UINavigationViewController と他の 2 つのビュー コントローラーを使用して新しいプロジェクトをセットアップしました。

私のアプリデリゲートには、次のものがあります。

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];

firstViewController = [[NCTFirstViewController alloc] initWithNibName:@"NCTFirstViewController" bundle:nil];
navController = [[NCTNavViewController alloc] initWithRootViewController:firstViewController];

self.window.rootViewController = self.navController;

[self.window makeKeyAndVisible];

私の UINavigationController.m ファイル内で、タイトルとセットアップ ボタンを設定できますが、これは機能しません。

これは、実際のView Controller自体にself.navigtionControllerアイテムをセットアップした場合にのみ機能します。これは正しいですか、それともこれを機能させるために UINavigationController で行うべきことがありますか。

理想的には、他のコントローラーへのすべてのプッシュを処理する UINavigationController を探しています。長期的には、メニューシステムとして使用されます。したがって、ユーザーが上部のボタンをクリックすると、新しいビュー コントローラーにプッシュされますが、戻るオプションはなく、上部のナビゲーション バーに同じメニュー項目が表示され、新しい中央のビュー コントローラーが表示されます。

私が抱えている問題は、これがどのようにセットアップされているかを理解することです。ビューコントローラー自体でこれをセットアップする必要がある場合、それらはすべて同じコードを複製しません。もちろん、AppDelegate ですべての「動き」をセットアップすることもできますが、これは正しくないようで、App Delegate 自体をまとめてしまいます。

4

2 に答える 2

3

UINavigationController クラス リファレンスを見ると、次のように書かれています (強調は私が追加しましたが、これがどのように機能するかを理解するためにすべてを読む必要があります)。

ナビゲーション バーの更新
ユーザーがトップレベルのビュー コントローラーを変更すると、ビュー コントローラーをプッシュまたはポップするか、ナビゲーション スタックの内容を直接変更するかによって、ナビゲーション コントローラーはそれに応じてナビゲーション バーを更新します。具体的には、ナビゲーション コントローラーは、ナビゲーション バーの 3 つの位置 (左、中央、右) のそれぞれに表示されるバー ボタン項目を更新します。バー ボタン アイテムは、UIBarButtonItem クラスのインスタンスです。必要に応じて、カスタム コンテンツを含むアイテムを作成したり、標準システム アイテムを作成したりできます。バー ボタン アイテムの作成方法の詳細については、UIBarButtonItem クラス リファレンスを参照してください。

ナビゲーション バーの左側にあるバー ボタン項目を使用すると、ナビゲーション スタックの前のビュー コントローラーに戻ることができます。ナビゲーション コントローラーは、ナビゲーション バーの左側を次のように更新します。

  • 新しい最上位ビュー コントローラーにカスタムの左バー ボタン項目がある場合、その項目が表示されます。カスタムの左バー ボタン項目を指定するには、View Controller のナビゲーション項目の leftBarButtonItem プロパティを設定します。
  • 最上位ビュー コントローラーにカスタムの左バー ボタン項目がなく、前のビュー コントローラーのナビゲーション項目の backBarButtonItem プロパティに有効な項目がある場合、ナビゲーション バーにその項目が表示されます。
  • カスタム バー ボタン項目がどちらのビュー コントローラーでも指定されていない場合、デフォルトの戻るボタンが使用され、そのタイトルは前のビュー コントローラー (つまり、1 レベル下のビュー コントローラー) の title プロパティの値に設定されます。スタック。(ナビゲーション スタックに View Controller が 1 つしかない場合、[戻る] ボタンは表示されません。)

ナビゲーション コントローラーは、ナビゲーション バーの中央を次のように更新します。

  • 新しい最上位ビュー コントローラーにカスタム タイトル ビューがある場合、ナビゲーション バーには、デフォルトのタイトル ビューの代わりにそのビューが表示されます。カスタム タイトル ビューを指定するには、View Controller のナビゲーション項目の titleView プロパティを設定します。
  • カスタム タイトル ビューが設定されていない場合、ナビゲーション バーにはビュー コントローラーのデフォルト タイトルを含むラベルが表示されます。このラベルの文字列は通常、View Controller 自体の title プロパティから取得されます。ビュー コントローラに関連付けられているものとは異なるタイトルを表示する場合は、代わりにビュー コントローラのナビゲーション アイテムの title プロパティを設定します。

ナビゲーション コントローラーは、ナビゲーション バーの右側を次のように更新します。

  • 新しい最上位ビュー コントローラーにカスタムの右バー ボタン項目がある場合、その項目が表示されます。カスタムの右バー ボタン項目を指定するには、View Controller のナビゲーション項目の rightBarButtonItem プロパティを設定します。
  • カスタムの右バー ボタン項目が指定されていない場合、ナビゲーション バーの右側には何も表示されません。

ナビゲーション コントローラーは、トップ ビュー コントローラーが変更されるたびにナビゲーション バーを更新します。したがって、これらの変更は、View Controller がスタックにプッシュされるかスタックからポップされるたびに発生します。プッシュ操作またはポップ操作をアニメーション化すると、ナビゲーション コントローラーは同様に、ナビゲーション バーのコンテンツの変化をアニメーション化します。

そのため、必要なことを行うには、各ビュー コントローラーにタイトルとボタンを設定する必要があります。タイトルを設定する最も簡単な方法は、ストーリーボード/xib、または作成時にコードで設定することです。

また、View Controller をナビゲーション スタックにプッシュするのではなく、ルート View Controller を置き換えて、View Controller をスタックに追加し続けないようにする必要があります。これにより、戻るボタンも表示されなくなります。明示的に削除する必要はありません。setViewControllers:animated:これを行うには、次のような方法を使用します。

[self.navigationController setViewControllers:[NSArray arrayWithObject:theNewViewController] animated:YES];
于 2012-11-03T04:08:52.933 に答える
0

NavigationController は 1 つだけで、この NavigationController がすべての ViewController を制御します。したがって、barButtonItems と titles は各 ViewController に設定されるため、NavigationController に直接設定しないでください。

新しいViewControllerをプッシュしたいがプッシュバックしない場合、NavigationControllerはスタックを使用してすべてのViewControllerを処理しているため、問題が発生する可能性があると思います。ViewController をスタックにプッシュするが、ポップしないようです。おそらく、望ましくない動作が発生する可能性があります。

それでもこれを実装したい場合は、別の ViewController で同様の設定を行うことは避けられないと思います。

于 2012-11-03T03:06:03.380 に答える