• ベストアンサー

Navigation-Basedデータ受け渡し

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

  • Mac
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • iPad NavigationにSplitView

    Navigation Basedアプリで、画面遷移してSplitViewを表示したいのです。 以下を参考に、Viewを切り替えてのSplit Viewの表示はできました。 http://temping-amagramer.blogspot.com/2010/09/ipadobjective-c.html LeftTableViewController *lefttableviewcontroller = [[LeftTableViewController alloc] initWithStyle:UITableViewStylePlain]; LeftNavigationController *leftnavigationcontroller = [[LeftNavigationController alloc] initWithRootViewController:lefttableviewcontroller]; RightViewController *rightviewcontroller = [[RightViewControlleralloc] initWithNibName:nil bundle:nil]; RightNavigationController *rightnavigationcontroller = [[RightNavigationController alloc] initWithRootViewController:rightviewcontroller ]; MainSplitViewController *mainsplitviewcontroller = [[MainSplitViewController alloc] init]; mainsplitviewcontroller.viewControllers = [NSArray arrayWithObjects:leftnavigationcontroller,rightnavigationcontroller,nil]; [self.view addSubview:mainsplitviewcontroller.view]; これで、最後の addSubviewしている箇所を [self.navigationController pushViewController:mainsplitviewcontroller animated:YES]; と書き換えれば、Navigation Baseed アプリにも Split Viewが表示されるのでは? と考えたのですが、エラーも出ずにスルーされます。 ちなみに、Split View関連のソースをコピーして、別プロジェクトでsubViewとして表示されるので、 Split View自体のコードは正そうです。 悪い箇所を教えていただけますでしょうか。

  • 子フォームから親フォームへのデータの受け渡し

    いつもお世話になっております。 VB.NETの質問です。 親フォームから子フォームを開き、子フォームで検索した結果を親フォームに返したいです。 はじめはテキストボックスへ表示させており、何の問題もなく出来ていたのですが、 仕様を変更してコンボボックスやラベルのテキストに表示させるようにしたら、子フォームからデータを取れなくなりました。というか表示されなくなりました。子フォームのme.close()する直前の変数の値にはデータが入っているのですが・・・ なんでなんでしょうか? 開発一筋でやられてきた方には、本当に初歩的な質問だと思いますが、 よろしくお願い致します。

  • phpmyadminでのデータ挿入について

    phpmyadmin(ver3.4.9)を利用しています。 リレーションビューを用いて、以下のようなリレーションを組んだとします。 【商品テーブル】 id name 【売上テーブル】 syouhin_id uriagegaku ※商品テーブルのidと、売上テーブルのsyouhin_idがリレーション 売上テーブルのデータ挿入において、 現在は、syouhin_idのセレクトボックスには、 商品テーブルのidの値が出てきます。 これだと何の商品かよくわからないため、 データ挿入の効率を上げるため、 syouhin_idのセレクトボックスに商品名(nameの値)が出るような方法はありますでしょうか。 あくまでも、データ挿入時に商品名を参照したいのであって、 実際のデータは商品id(idの値)をsyouhin_idに入れたいのです。 つたない説明ですが、ご教授ください。 社内プログラマが急病のため、 プログラムを組んだりすることができず、 phpmyadmin画面内でのデータ挿入となりました。 なにとぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • ASPで画面間のパラメタ受け渡し

    こんばんは。ASP初心者です。 ASPでWEBページの作成を行っています。画面遷移をResponse.Redirect()で行っているのですが、遷移前のページと遷移後のページでパラメタを受け渡したい場合はSession("hoge") = "hogehoge"のようにセッションに入れる以外、何か方法はないでしょうか。リクエスト間でパラメタ渡せればがいいので、セッションを通じて保持しておく必要がないのです。クエリを使用するとアドレス欄に変数の値が見えてしまうのでできれば使いたくありません。

  • javascriptを使ってパラメータの受け渡し

    お世話になります。 親ウィンドウから検索用PHPファイルを子ウィンドウで開き、DB検索を行う検索機能を作っています。 小ウィンドウでの検索結果を function window_close(){ opener.FormA.textA.value = formB.textB.value window.opener.document.getElementById("textA").focus(); window.close() } というスクリプトで親ウィンドウの該当するテキストに渡すようにしています。 この方法でも検索はでき、検索結果を親ウィンドウ側で受け取ることは出来ています。 しかし、この検索画面を複数のテーブルに対して使おうとすると親ウィンドウからパラメータを渡 すことができずテーブルの数だけPHPファイルを作らなくてはなりません。 そこで、動的に対象テーブルを変えることができないか悩んでいます。 イメージとしては、functionの引数でテーブル名を指定し、その値をPHPに渡したいと思っているのですが可能でしょうか。 Jqueryの$.post()が使えるかなとも思ったのですが、正直使い方がよくわかりませんでした。 どなたかよい方法があれば教えてください。

  • Access テーブルにデータを取り込む際 下記の条件でやるには どうしたらよいでしょうか?

    テーブル名「テーブル1」で 中身が フィールド名1,値1 フィールド名2,値2 フィールド名3,値3 というデータがあったとします。 このデータを 名前,フィールド名1,フィールド名2,フィールド名3 というフィールドをもったテーブルに1レコードとして書き込んで行きたいのです。 簡単な方法あるでしょうか? 結果として 名前,フィールド名1,フィールド名2,フィールド名3 テーブル1,値1,値2,値3 というレコードになります。 次に2レコード目は また別の「テーブル2」を書き込みます。 よろしくお願いします。

  • iPhoneアプリの開発についてです。

    元のビューからモーダルで表示させるビューに画面遷移に伴い値を受け渡したいのですがうまくいきません。 私は主に画面遷移する際 ○○○ *△△△ = [self.storyboard instantiateViewControllerWithIdentifier:@"□□□"]; [self presentViewController:△△△ animated:YES completion: nil]; とコーディングしています。 インスタンス生成部分を ○○○ *△△△ = [[○○○ alloc] init]; とすれば簡単に値が受け渡しできるのですが、storyboadで作ったような表示になりません。(セルの高さが違う、ラベルが表示されないなど) グローバル変数などを使っても解決できますが、なるべく複雑にはしたくありません。 ご指摘お願いします。

  • データのバックアップ

    お世話になります。 SQLSeverでテーブルやビューの構成などをスクリプトファイルで保存し そのテーブルに入ってるデータもデータのみで保存したいと思います。 それから別のSQLSeverに作成したスクリプトファイルと データを入れて前記の構成をコピーしたいのですが その際のデータのバックアップ方法と復元方法は どのようにすればいいのでしょうか。

  • Xcodeで子のViewから親の変数を変更する

    こんにちは 現在Xcodeでの作業をしています。 画面の遷移の際に現在は (親から子どもへの値を渡す場合<遷移する場合>) ViewcontrollerA *svc = [[ViewcontrollerA alloc] init]; svc->hogehoge = 1; //値などを入れる場合 [self presentModalViewController:svc animated:yes]; [self.parentViewController dissmissModalViewControllerAnimated:YES]; と値を入れているのですが、 逆に上記のAという子どもの(インスタンス内)から親の変数をいじるにはどうすればいいですか? super->parenthogehoge =1 みたいにできればいいのですが、これだとうまくいかなくて・・・。 よろしくお願い致します。

  • 改行コードが入ったデータの受け渡し

    教えて下さい。 現在、問い合わせページのような画面を作成し、その中で "TEXTAREA"に入力されたものを最終的にはデータベースの中 へ格納しようとしています。 画面の遷移としては、a.php(入力)⇒b.php(確認)⇒c.php(更新) というように3画面の構成で考えています。 その際に、最初の入力画面では"TEXTAREA"を使用している為、改行 等のデータも含まれてしまいます。 2画面目にはそのままPOSTで値を後れましたが、3画面目へは <INPUT type='hidden' ~ で飛ばしています。 しかし、その際に、当初画面上から入力された改行コードでデータが 切れてしまい、最後の更新画面では切れたデータしか取得できません。 改行コードを変換する為に、str_replace 等を使用してみましたが、 それでも上手くいきません。 このような改行を含むようなデータの受け渡しはどのようにするのが 良いのでしょうか。。。 教えて下さい。

    • ベストアンサー
    • PHP