UINavigationViewで、ひとつ上の階層のビュー(親ビュー)に戻るときにデータを渡す方法

http://kontonsoft.blog.shinobi.jp/Entry/50/

うーん、おっしゃるとおり。
データ保存用のクラスを作って、これを中継して親ビューにデータを渡していましたが、なんだかまどろっこしくてもっとすっきり変数を渡すいい方法はないのかと思っていたんですよね。だって、子ビューに移行するときには、生成した子ビューのviewControllerに変数を渡してからpushViewControllerすればいいだけでしょ?このくらい簡潔に変数の受け渡しができないもんかな、って思いますよね〜。

親ビューに戻る際には、popViewControllerというメソッドを使います。でも、親ビューは改めて生成するわけではないので、変数の受け渡しどころがなくって困ってしまいます。そこで見つけたのが上記サイト。ふむふむ、どうやらnavigationControllerには画面遷移の履歴を格納しているviewContollersというプロパティがあるようですな。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSArray *array = self.navigationController.viewControllers;
    int arrayCount = [array count];
    HogeViewController *parent = [array objectAtIndex:arrayCount - 1];
    parent.piyo = piyo;
}

こいつを子ビューに実装。今回はこんな感じで解決。

ちなみに参考サイトでは、viewControllersのカウントから-2していました。これは、子ビューの任意のメソッドからviewControllersを呼び出したときには、子ビュー自身がarrayに含まれているので、親ビューは-2に相当しますが、viewWillDisappearから呼び出した場合には、すでにarrayから子ビュー自身が削除されているので、親ビューの位置は-1(=lastObject)に相当します。