iOS View Controller カタログ NavigationController について斜め読みしたメモ
navigationBarプロパティについて少し気になったので、View Controller Programming Guide for iOSを読んだところ、
For information about how to configure and use navigation controller objects, see Navigation Controllers in View Controller Catalog for iOS .
とあったので、
https://developer.apple.com/jp/documentation/ViewControllerCatalog.pdf を見ました。
まとめようかな、と思ったら20ページ超えてたので、とりあえず印象に残った部分だけ引用(一部メモ)。
印象に残った部分
Navigation Controllerからの通知に応答するために、デリゲートオブジェクトを提供することもできます
このスタックに最初に追加された要素はルートViewControllerになり、スタックからポップされません。それ以外の要素は、UINavigationControllerクラスのメソッドを使用してスタックに追加できます。
[self.navigationController pushViewController:viewController animated:YES];
な感じか。
最上位のView Controllerと表示されるView Controllerは必ずしも一致しません。たとえば、View Controllerをモーダルモードで表示する場合、visibleViewControllerプロパティの値は、表示されたモーダルView Controllerを反映して変更されますが、topViewControllerプロパティは変更されません
スタック内の各コンテンツViewControllerが、スタックの最上位のコンテンツViewControllerを設定し、 プッシュするというデザインパターンをとります。
ほとんどの場合、プログラムによってView Controllerをポップする必要はありません。代わりに、Navigation Controllerは戻るボタンをNavigation Barに表示し、ユーザがこのボタンをタップすると、自動的に一番上のView Controllerがポップされます。
下の方で引いているけど、デフォルトのボタンの挙動を変えてナビゲーションバーの設定をしたい場合は、NavigationBarクラスのインスタンスのプロパティやメソッドを使っていくことになる。
- ウインドウのルートView Controllerとして追加する。
- Tab BarインターフェイスのタブのView Controllerとして追加する。
- Split Viewインターフェイスの2つのルートView Controllerの1つとして追加する。(iPadのみ)
- 別のView Controllerからモーダルモードで表示する。
- Popoverから表示する。(iPadのみ)
最初の3つのシナリオでは、Navigation Controllerは基本的なインターフェイスのきわめて重要な部分 となり、アプリケーションが終了するまで存続します。最後の2つのシナリオは、NavigationController の一時的な用法を表しています
ナビゲーションインターフェイスごとに、ルートレベルを表す1つのデータレベルが存在します。こ のレベルはインターフェイスの起点となります。
ナビゲーションインターフェイスを実装するために、データ階層の各レベルに配置するデータの内容を決定しなければなりません。レベル別に、そのレベルのデータを管理および提示するコンテンツView Controllerを指定します
リーフデータを管理するView Controllerを除いて、各コンテンツView Controllerは、ユーザがデータ階層の次のレベルにナビゲートするための手段を提供する必要があります。
具体的に言うと、次のViewControllerをプッシュする関数とそれを呼び出すイベントハンドラの追加みたいな。
この新規のView Controllerは、関連する写真を表示するのに十分なアルバム情報で初期化されます。
フルスクリーンレイアウトでは、コンテンツビューはNavigationBar、ステータスバー、およびツールバーの背後に重なるように設定されます。この配置によって、ユーザ向けのコンテンツの表示領域を最大にできるため、写真の表示やスペースを広くとりたい場合に役立ちます。
実際には、ナビゲーションインターフェイスについては、どのような状況でもフルスクリーンの境界に合わせてウインドウを作成する方が優れています。Navigation Controllerは、いずれにしてもそのビューのサイズをステータスバーに合わせて自動的に調節するからです。
Navigation Controllerをモーダルモードで表示している場合、そのNavigation Controllerが表示するコン テンツは、Navigation Controllerの表示を実行しているView Controllerによって制限されます。
親のビューは、モーダルモードで表示されたビューの表示の仕方に必ず何らかの影響を与えます。
ナビゲーションスタックに存在するオブジェクトは、各自が責任を持って作成
ナビゲーションスタックのシナリオ
* 階層データの次のレベルを表示する。 * 階層内を1レベル戻る。 * ナビゲーションスタックを前の状態に復元する。 * ユーザをルートView Controllerに戻す。 * 階層内を任意の数のレベルだけ戻る。
View Controllerがプッシュまたはポップされる場合は必ず、Navigation Controllerは影響を受けるView Controllerにメッセージを送信します。Navigation Controllerはまた、スタックの変更時にデリゲートにもメッセージを送信します。
複数のView Controllerを一度にプッシュまたはポップした場合、表示されているView Controllerと、表示される予定のView Controllerのみでメソッドが呼び出されます。
Navigation Controllerと同様に、NavigationBarはほかのオブジェクトが提供するコンテンツのためのコンテナです
えっ、Navigation ControllerとNavigation Barって違うの? Navigation ControllerのUIがNavigation Barだと思っていたぞ...。
とりあえず、Navigation Barのバーを作れば、私の思うナビゲーションバーのボタンが作れるらしい。
rightBarButtonItem
デフォルトではこの位置は空いています。この位置は、通常、現在の画面を編集したり変更したりするためのボタンを配置するために使われます。
ナビゲーションインターフェイスでは、Navigation Controllerは自身のUINavigationBarオブジェクトを所有してその管理を担当します。NavigationBarオブジェクトを変更したり、その境界、フレーム、またはアルファの値を直接変更することは許されていません。
おそらく、NavigationBarはやっぱりNavigationControllerの管理するビューなんだけどUIButtonなどとは管理の仕方が異なる感じ。
NavigationBarのプロパティは、NavigationBarをプロパテ時として持つNavigationControllerから変更するのが基本だけれど、一部のプロパティだけ変更できる感じ?
たとえば、
Navigation Bar全体を表示または非表示にするには、同様に、Navigation Barを直接変更するのではなく、Navigation ControllerのsetNavigationBarHidden:animated:を使用
特定のView Controller用にNavigation Barの外観をカスタマイズするには、それに対応するUINavigationItemオブジェクトの属性を変更します。
View Controller用のNavigation Itemを変更しなくても、Navigation Itemは、ほとんどの場合に十分対応できるデフォルトのオブジェクトセットを提供します。カスタマイズを行えばそれらはすべてデフォルトのオブジェクトよりも優先されます。
その場での編集をサポートするビューでは、ユーザが表示モードと編集モードを行き来できるようにする特別なタイプのボタンをNavigation Barに含めることができます。
(常にではなく)ときどきツールバーを非表示にする場合は、必要なときにそのNavigation Controller のsetToolbarHidden:animated:メソッドを呼び出します。
このメソッドがよく使用されるのは、setNavigationBarHidden:animated:メソッドの呼び出しと組み合わせて、一時的にフルスクリーンビューを作成する場合です。たとえば、「写真(Photo)」アプリケーションでは、1つの写真を表示しているときにユーザが画面をタップすると、両方のバーの表示/非表示が切り替わります。