Hatena::ブログ(Diary)

なんとなく

2012-06-22

UINavigationController で1つの画面から複数の画面に遷移したい

UINavigationController を1つのViewController にRoot設定したら、階層で
画面遷移するのは、周知の通り。多分。

で、1つの画面から 違う2つの画面に遷移したい。A画面で Bボタンを押したら、B画面。
Cボタンを押したら、C画面っていう風に。

☆やりたいことのイメージ
f:id:heppokose:20120622111402p:image

☆普通の階層遷移は こんな感じ。
f:id:heppokose:20120622111403p:image

普通の方は、遷移画面が1種類。やりたいのは1つの画面から2つ以上の画面に
遷移したい。で、普通のように、

BViewController *bViewController = BViewController alloc] initWithNibName:@"BViewController" bundle:nil];
[self.navigationController pushViewController:bViewController animated:YES];

ハイ。普通に遷移しました。アレ?なんか変。「Back」ボタンに、前画面のTitleではなく
"Back" って書いてある…? しかも、なんかログが…

・ログ
nested push animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
Unbalanced calls to begin/end appearance transitions for <BViewController: 0x7cbc5e0>.


navigation bar が破壊された。アンバランスな呼び出しの為に、どうたらこうたら…orz

とりあえず、Back ボタンをタップしたけど、白い画面に…
要するに、なんか間違ってる訳ね。(^_^;)

どうやら、次画面遷移終了(willViewDisappeared)が完了しないウチに、次画面に遷移してしまった
ということらしい。

iOS: popViewController unexpected behavior
http://stackoverflow.com/questions/5301014/ios-popviewcontroller-unexpected-behavior

??? ホントか?と思って、試してみたけど なんか違う。
今まで A → B は正常に遷移してた。Aは、UITableViewController で、選択したテーブルセルの
Index(IndexPath.row)で、"A → B" or "A → C" を判定してたから。


更に調べると、UINavigationController は、階層遷移時の画面情報を管理してるらしく(そりゃそうだ)、
そのUINavigationController が管理してるプロパティ"viewControllers"で、どの画面に戻るのか、
進むのか、管理できるらしい!

☆[iOS]UINavigationControllerの進んだ時、戻った時のイベント
http://cheesememo.blog39.fc2.com/blog-entry-19.html

なるほどー! で、"viewControllers" とはなんぞや?(^_^;)


☆UINavigationController Class Reference
http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

プロパティの viewControllers を見ると

The view controllers currently on the navigation stack.

階層情報を管理するスタックってことか!(多分…)


だから、popで1つ前の階層に戻るだけじゃなく、2つ前の階層を指定して戻ったりする訳ね!

☆UINavigationControllerをつかって、今のビューより2つ後ろに戻るには?
http://ssdkfk.wordpress.com/2011/07/25/uinavigationcontrollerをつかって、今のビューより2つ後ろに戻/


見てても分からないから、動かして見てみよう。

適当に、階層遷移させて、最後の viewDidLoad で (NSArray *)nav = "viewControllers" をログ出力すると


2012-06-22 14:53:13.896 AppName[3632:11603] nav=<AViewController: 0x6ea8590>
2012-06-22 14:53:13.896 AppName[3632:11603] nav=<BViewController: 0x6ee7da0>
2012-06-22 14:53:13.897 AppName[3632:11603] nav=<CViewController: 0x79c0dc0>


なるほど!ココで、辿ってきたViewを管理してるわけね!(そう書いてある…w)

私のやりたいのは、"A → B" or "A → C" なので、pop処理の中で
戻るべき画面のXIBファイル名を指定すればよいのか?

あれ? 進むのが複数なんだけど、単なる push じゃだめよね?
push も画面指定でできるのか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/heppokose/20120622/1340332007
リンク元