storyboard でもっかい接続してみるってのも、原始的ながら有効なことあるんだね。

今日ハマったのは、navigationController で戻ってきたときの値の渡し方と、 viewDidLoad が呼ばれないので KVO の登録ができず、結果、値が変わっても呼ばれないという罠。

順を追って説明すると、navigationController の back ボタンで戻ってきました。さて、戻り先に値を渡すにはどうするのか。segue を使っていればそれ用の method があるんだけど、navigationController のときってどうすんの、というのが分からない。

調べてみたところ、以下の method があった。

-(void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

didShowViewController が戻り先の viewController なので、戻り先の viewController の property を設定することで値を渡せる。

戻り先で値が渡るのはどのタイミングなのか。なんでタイミングが知りたいかというと、値が渡ったら UILabel の表示を変更したいから。viewDidLoad かなと思ったら、これは一度しか呼ばれない。viewWillAppear とか viewDidAppear なら表示されるたびに(back で戻ってきたたびに)呼ばれるので、ここかなと思ったら、このタイミングでは property の値が渡ってきてないことが判明。

さぁ、困った・・・あ、そうだ KVO があるじゃないかと、viewDidLoad で登録して、次の method で確認すると、この method がそもそも呼ばれてないのですが・・・

- (void) observeValueForKeyPath:(NSString *)keyPath

                      ofObject:(id)object

                        change:(NSDictionary *)change

                       context:(void *)context

うーん困った。まじクソハマり。

その後、調べてみたら、そもそも viewDidLoad が呼ばれていないので、KVO の登録がされていないことが判明。登録されていないなら、method 呼ばれないよね。なんで viewDidLoad が呼ばれないわけ?あ、navigationController の位置が悪いのか?と思い、もっかい接続やり直したり、navigationController の位置を変更したりしてたら、直った。viewDidLoad が呼ばれるようになり、KVO 登録もされ、back で戻ってきたら method が呼ばれるようになる。

storyboard でもっかい接続してみるってのも、原始的ながら有効なことあるんだね。