• ベストアンサー

Navigation-Basedデータ受け渡し

Navigation-Basedでテーブルを遷移する際、親から子にデータを送るのは detailViewController.子の変数名 = 送りたい値; でできたのですが、これの逆はできないんでしょうか? モーダルビューなどで使われるようなのですが、簡潔にdetailViewControllerにデータをくっつけて子から親に送る方法は無いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> RootViewControllerの実装ファイルのcellForRowAtIndexPathに 「- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath」の書き間違いですか? こちらでNavigation Basedのサンプルプロジェクトを作って、私が説明したコードを記述して動かしてみたところ、なにもエラーは出ず、ちゃんと期待どおりの結果が出ました。 私の説明の中で書いたコードは、それらですべてではなく、必要だけど記述していないコードが多数あることは、ご理解ください。おそらくなにかコードが不足しているだとか、記述間違いがあるとかが、あるのではないでしょうか? とくに、「#import」の無限連鎖には注意してください。クラス「ClassA」のヘッダファイルに、「#import "ClassB.h"」と記述し、クラス「ClassB」のヘッダファイルに「#import "ClassA.h"」と記述すると、ヘッダファイルを永遠にインポートし続ける無限連鎖が発生します。ご存じかもしれませんが、ねんのため説明しておきます。この無限連鎖を防止するには、ヘッダファイル(~.h)ではなく実装ファイル(~.m)に#imoortを記述する、あるいは#importではなく、前方宣言(@class ~)を使うという方法があります。 ※UIViewControllerのサブクラス名に「NextView」とつけるのは、感心できません。ViewとView Controllerの区別をちゃんと付けていないと、あとで痛い目に遭うのはプログラマ自身です。こういう区別をあやふやにする傾向は、あなた以外の人にもあって、おそらく長々しいクラス名を打ち込むのがめんどうという気持ちが、だれにも働くからだと思われます。しかしXcodeには自動入力補完の機能があり、長いクラス名もたいして苦痛にはなりませんので、ちゃんとそのクラスの機能に合わせた命名をこころがけましょう。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> detailViewController.子の変数名 = 送りたい値; じつはこれが重要なヒントになっています。 「子の変数名」を、親ビューコントローラのインスタンス名にすると、どうでしょう? 「detailViewController」のクラス名を仮に「DetailViewController」とすると、DetailViewControllerのヘッダファイルの、プロパティ宣言で、 @property (nonatomic, retain) id myParent; とでもしておきます。 親ビューコントローラのクラス名を仮に「RootViewController」とし、その中でdetailViewControllerを生成する箇所で、直後に、 detailViewController.myParent = self; と記述することで、子から親のインスタンスを取得することができます。 子から親に渡したいデータが、仮にNSString *型だとしたら、RootViewControllerの持つプロパティとして、 @property (nonatomic, retain) NSString *birthdayPresent; とでも宣言しておきます。 DetailViewControllerの実装部の中で、親にデータを渡すコードはこう書きます。 RootViewController *controller = (RootViewController *)self.myParent; controller.birthdayPresent = @"Happy birthday!"; これでデータが渡せます。 なおこの手法をより緻密に組み立てたものが、Objective-Cの機構のひとつであるDelegateです。 蛇足ですが、親子の関係であれば、互いのインスタンスが開放されていないことが保証されますが、兄弟関係の場合は保証されない(開放されているかもしれない)ので、兄弟の間でのデータ渡しはするべきではありません。

Ptakako
質問者

補足

ありがとうございます 教えていただいた内容を自分なりに解釈してテストしてみました 親:RootViewController 子:NextView NextView のヘッダファイルに @property (nonatomic, retain) id myParent; を宣言 RootViewControllerのヘッダファイルに    @interface RootViewController : UITableViewController {    NSString *birthdayPresent; //こんな感じで    }    @property (nonatomic, retain) NSString *birthdayPresent; //記述    @end RootViewControllerの実装ファイルのcellForRowAtIndexPathに NextView *detailViewController = [[NextView alloc] initWithNibName:@"NextView" bundle:nil];   detailViewController.myParent = self;  //ここに記述 // ... // Pass the selected object to the new view controller. [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; とこの時点で実行するとアプリが落ちてしまいました.... detailViewController.myParent = self; をコメントアウトすると落ちなくなったので、おそらくこの記述が 間違っているのだと思いますが わかりませんでした 子でIDを作って、それの受け入れ先は自分だと親ファイルで宣言してプロパティを公開した値をやりとりする みたいなイメージなんですが、間違ってますでしょうか? ちなみにiosSDKは4.3 xcodeは3.2.6です 

関連するQ&A