2012-02-01 26 views
0

私は、AddQuoteViewControllerを呼び出すRootViewControllerを持っています.RootViewControllerで設定した変数 "subject_id"があり、それはAddQuoteViewControllerに表示されません。それを修正する方法。1つのViewControllerから別のViewControllerにオブジェクトを渡すには

Subject *sub = [self.tableDataSource objectAtIndex:indexPath.row]; 

    self.subject_id = sub.subject_id; 

    [self addQuote_Clicked: sub]; 

...

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

    if(addNavigationController == nil) 
     addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

    [self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

その後、私のAddQuoteViewControllerに私はこのように、この変数にアクセスしよう:

RootViewController *rv = [RootViewController alloc] ; 

NSLog(@"rv.Subject_id = %d", rv.subject_id); 

しかし、何も得ます。これを行う簡単な方法が必要です。

+0

可能な複製[1つのViewControllerから別のViewControllerにオブジェクトにアクセスする方法](http://stackoverflow.com/questions/704524/how-to-access-objects-from-one-viewcontroller-to-another-viewcontroller) )。これは*非常に*よくある質問です。ここにリンクされているものがあなたが探しているものと正確に一致しない場合は、探してください - このテーマにはさまざまなバリエーションがあります。 – Caleb

+0

ありがとうCalebしかし、私は見て少し時間を過ごしたと私はここに他の記事で得た明確な方向を見つけることはありませんでした。 – jroyce

答えて

1

あり、これを行うの様々な方法がありますが、短い答えは - あなたはAddQuoteViewControllerにプロパティとしてRootViewControllerへの参照を設定することができますAddQuoteViewController.h

すなわち

RootViewController *rvc 

...

@property (nonatomic,assign) RootViewController *rvc; 

および対応するgはあなたの実装クラスで合成してリリースします。次に、(AddQuoteViewController.m)

あなたがRootViewControllerの内側にあなたのAddQuoteViewControllerを作成し、また、このプロパティを設定します。

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 
    aqvController.rvc = self; 
... etc. 

その後、このプロパティを経由してあなたのAddQuoteViewController内のルートビューコントローラの任意のプロパティにアクセスできます。

あなたの質問には少し異例のことがあります。新しいものを割り当てることでオブジェクトへの参照を取得しようとするのと同様に、新しいナビゲーションを作成するそれをモーダルビューコントローラとして提示するのが一般的です(新しいナビゲーションコントローラを作成する必要はありません)。つまり、ビューコントローラを作成してモーダルに提示するか、ビューコントローラを作成して現在のナビゲーションコントローラスタックにプッシュします。

+1

これは循環参照になりませんか?それはメモリ管理にいくらかの複雑さを加えるかもしれませんが、ここで使用されているのであれば私はまだARCに精通していません。 –

+0

この方向をありがとう。私は自分のコードがちょっとばかげたことを理解しています - それは、文字通り自分の足を見つけて、そのプロセスの中でぶらぶらしているからです。 – jroyce

+0

Mr Jefferson - 良い点 - aqvcはrootvcのメンバーであるため、リリースするとaqvcによって保持されます。だから、この問題を避けるためには、aqvcのプロパティを代入するのではなく、プロパティを代入する方が良いでしょう。私は投稿を編集しました。 – gamozzii

1

このようなビューコントローラ間で変数にアクセスすることはできません。 グローバルにアクセス可能なシングルトンクラスを作成します。 AppDelegateでアクセスすることができますが、グローバル変数を持つことはお勧めできません。

+0

シングルトンは技術的にはうまくいくでしょうが、それはほとんどOPの問題の設計上の選択肢としては間違いありません。シングルトンがその役割を果たしているかもしれませんが、悪用された場合にはすぐにアプリのデザインを破壊することができます。私はこの状況を虐待と呼ぶでしょう:) –

2

まず、3番目のコードブロックにエラーがあります。これは:

RootViewController *rv = [RootViewController alloc] ; 

これである必要があります:

RootViewController *rv = [[RootViewController alloc]init]; 

しかし、厳密には、あなたのインスタンス変数が表示されない理由はありません話します。

私が正しく理解している場合、コードの最初の2ブロックはRootViewControllerにあり、AddQuoteViewControllerをインスタンス化して提示します。次に、AddQuoteViewControllerにあるコードの3番目のブロックから、のメンバ変数(subject_id)にアクセスして、それを呼び出す必要があります。

あなたがRootViewController異なるインスタンスを作成しているので、AddQuoteViewController内からRootViewControllerをインスタンス化のアプローチは、動作しないでしょう。あなたが後にしているのは、ちょうどあなたが来たインスタンスの価値です。

おそらくそれを行う最も簡単な方法は、AddQuoteViewControllerに対応するプロパティを作成し、それが作成されますときにそれを設定することです:

- (void) addQuote_Clicked:(id)sender { 

if(aqvController == nil) 
    aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

if(addNavigationController == nil) 
    addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

aqvController.subject_id = self.subject_id; 

[self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

あなたはあなたがやったAddQuoteViewControllerと同じようにsubject_idプロパティを作成する必要がありますRootViewController

+0

ヒントありがとうございます。私はそれを私のAddQuoteViewControllerは、上記のために設定されているsubject_id変数を持っていなければならないでしょうか? – jroyce

+0

はい。最初のコードブロックで 'self.subject_id'と' sub.subject_id'と言うことが可能になったときに、すでにそれを行っています。 'subject_id'はgamozziiの答えが示すように' @ property'宣言で宣言されています。 –

関連する問題