woshidan's loose leaf

ぼんやり勉強しています

第3回 mixi iOS trainingについてメモ

ちょっとばたばたしていたので、とりあえず、簡単に書いています。 今週末、また追記してブログの方に移すと思います。

最近やたらとmacのファンがうるさくて充電回らないし、泣きそうになっていたところ、Sublime Textがずっとこの辺のメモをファイルに保存せずに残しているせいで異常な起動時間、異常な消費メモリになってたのが原因だったっぽい事が分かったので、止めました。

たぶん、今週分のAndroidTrainingはDrawable回りを少し頑張ったら、そこまで深く考え方を問われないタイプのものだった気がするので楽天的に行きたいです。

慣れるまで録画から参加になりそうな気がしますが、作業の切り替え時に気が散りやすいのでそれはそれで勉強/作業時間がまとまっていいかもしれないです。

UINavigationControllerとは

下図の赤い部分のような、上の戻る等が表示されているナビゲーションバーを作るためのコントローラ。 ViewController同士の階層関係はスタック形式で管理する。 (下図はView Controller Programming Guide for iOSより引用)

f:id:woshidan:20150214173057p:plain

実装の時は、表示したい画面のViewContollerとは別に、さいしょにNavigationControllerを置いて、RootViewControllerを設定するViewControllerを用意する必要があります。

重要なプロパティ

プロパティ名 説明
viewControllers NavigationControllerで管理されているViewControllerのスタックを取得できる。
navigationBar NavigationControllerを使っているときに画面上部に表示されるバー。ViewControllerのタイトルや画面遷移に関するボタンを配置します
toolbar NavigationControllerを使っているときに画面下部に表示されるバー。表示しているViewControllerに固有の操作や、余り重要でない操作を行うボタン等を配置することがおおいです

toolbarの場所等は、以下の図(ViewControllerCatlogより引用)参照。

重要なメソッド

メソッド 説明
- initWithRootViewController: 最初に表示するViewControllerとしてrootViewControllerを渡して、UINavigationControllerを生成するイニシャライザです。
- pushViewController:animated: 引数として渡したViewControllerへ遷移します。このViewControllerはスタックに積まれ、遷移の階層が1つ深くなります。
- popViewControllerAnimated: 1つ前の階層に戻る画面遷移を行います。また、スタックの階層は1つ浅くなります

実装

navigationControllerの表示、push

https://github.com/mixi-inc/iOSTraining/wiki/2.1-UINavigationController より。

  1. プロジェクトテンプレートでSingle View Applicationを作成。
  2. pushされる側のViewControllerのクラスを作成。
  3. このクラスをstoryboard上で定義し、ボタンを追加、ボタンタップ時のハンドラをソースコードに記述してひもづける
  4. ボタンタップ時に新しいMixiViewControllerをNavigationControllerにpushするようにコードを記述する
  5. ViewControllerが起動した時にNavigationControllerを表示する

画面の遷移を前回では

- (IBAction)secondButtonTapped:(id)sender {
    [self performSegueWithIdentifier:@"presentMySecondViewController" sender:self];
}
// ViewController performSegueWithIdentifier:sender:

のようにsegueを実行するという形でやっていたけど、今回は、

- (IBAction)pushButtonTapped:(id)sender
{
    MixiViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MixiViewController"];
    [self.navigationController pushViewController:viewController animated:YES];
}
// NavigationController pushViewController:animated:

のように新しいViewControllerのインスタンスを作成して、NavigationControllerにpushする形で行っている。

rootViewControllerを呼びだすコントローラについて

最後の課題の説明図(https://github.com/mixi-inc/iOSTraining/wiki/2.1-UINavigationController より引用)で最初にNavigationControllerと書かれている灰色の画面があります。

f:id:woshidan:20150216233336p:plain

これは、NavigationControllerを設定して、それに最初に画面に表示されるViewController(ナビゲーションコントローラを使っているとき、いわゆる中身を表示しているビューコントローラをコンテンツビューコントローラというらしいです)をpushするコントローラを、画面に表示されるビューコントローラ(コンテンツビューコントローラ)とは別に用意する必要がある、ということらしいです。

NavigationBar UINavigationItem

ナビゲーションバーにデフォルトで戻るボタン等が用意されるが、これをコンテンツビューコントローラごとにカスタマイズしたくなったときにいじります。

図を見ている感じだと、基本的に特定のUIViewControllerへ戻るボタンとして表示される形式を指定するのは、戻るボタンを押したときに表示されるUIViewControllerの責務みたいです。

そのボタンを表示しているUIViewControllerの責務ではないです。

中央で表示しているタイトルや右側の特殊ボタン(たとえばEditなどを用意してその場で編集可能なフォームと表を切り替える)などについては、現在表示しているUIVIewControllerの責務です。

  • たぶん、あとで追記します

segueで情報の受け渡しについて

  • あとで書きます

その他メモ

  • 各コンテンツViewコントローラには次の階層のコンテンツViewコントローラへの導線を用意する必要がある
  • その導線となる関数において、自身が入っているスタックを管理しているNavigationControllerを呼び出して、次に表示するコンテンツViewControllerをpushする
  • NavigationBarなどの変更は変更を加えたいコンテンツViewコントローラのviewDidLoadedで行う?[要確認]

  • あとで整理します。