2012-06-02 12 views
7

、私はストーリーボードとseguesを使用して、次のように私はよく、セグエを行う前に、先ビュー・コントローラにデータを渡す:セグエ:私のアプリで先のView Controllerおかしな

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) { 
     [segue.destinationViewController performSelector:@selector(setMyData:) 
              withObject:myData]; 
    } 
} 

それは除いてどこでも動作します一箇所。セレクタが呼び出されると、データが設定されますが、セグが完了して宛先コントローラが表示されたら、設定したデータはありません。ビューコントローラのIDをソースビューコントローラとデスティネーションビューコントローラの両方に表示した後、上のコードのsegue.destinationViewControllerは、表示されるコントローラとは異なるビューコントローラのインスタンスであることがわかりました。何が起きてる?

[UPDATE 1] I宛先ビューコントローラのライフサイクルに見え、それは第一セグエ実行中にロードされるが、私はそれにプロパティを設定した後!つまり、performSelectorを呼び出すと、ビューコントローラオブジェクトは初期化されません。これは、私が設定したデータが固執しない理由です。なぜこれが当てはまるのか、私のアプリの他の部分で同じアプローチがなぜ機能するのか分からない。

[更新日2] setMyDataの投稿はリクエストによって行われます。 locationToOpenは公共の所有物なので、最初は私はこの方法を全く持っていませんでした。私はそれが呼び出され、デバッグ情報を印刷するために追加しました。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"NextSegue"]) 
    { 
     DestinationViewController *dest = [segue destinationViewController]; 

     dest.myData = self.myData; 
    } 
} 

をそしてDestinationViewController.hには、プロパティを作成する必要があります - - 次のように

- (void)setMyData:(MyData *)myData 
{ 
    DLog(@"self: %@", (id)self); 
    _myData = myData; 
} 
+0

destinationViewControllerはUINavigationControllerですか? – adambinsz

+0

@adambinsz:UINavigationControllerに埋め込まれたUIViewControllerです。 IBのセグはUIViewControllerにまっすぐ進みます。 – Macondo2Seattle

+0

あなたはそれがナビゲーションコントローラにはないと確信していますか? – adambinsz

答えて

5

私はそれを行うだろう

#import <UIKit/UIKit.h> 

@interface DestinationViewController : UIViewController 

@property (nonatomic, strong) NSObject *myData; 


@end 

も、MYDATAを合成するようにしてくださいDestinationViewController.mのプロパティ -

@interface DestinationViewController() 

@end 

@implementation DestinationViewController 

@synthesize myData = _myData; 

// other methods here 

@end 
+0

ありがとうございますが、これは私がすでに投稿したコードですでに行ったこととほぼ同じです。 – Macondo2Seattle

0

私はViewController私がいくつかの奇妙な点で変更するためにsegueを行っていたところ、 ちょっと見た後、segueが新しいViewControllerを作成したようです。

データ受け渡しの問題を解決するために、通知を使用しました。

0

このスレッドは古いと解決策が見つかるはずです。しかし、最終的な解決策はここに掲載されていないので、根本的な原因の1つ(私の場合はこれが原因です)を挙げたいと思います。私は同じ問題を抱えており、segueの送り先ビューコントローラに変数を設定しようとしました。根本的な原因は、オブジェクト変数をインスタンス化するのを忘れたことです([[Class alloc] init))。私は他のオブジェクトを指すのではなく、オブジェクトのプロパティを設定しているので、私の場合は必要です。この助けを願っています。

3

私はこの同じ問題がありました。それは私が私のprepareForSegueで設定していたターゲットViewControllerプロパティ:InterfaceBuilderが自動的に作成したものからプロパティをコピーして貼り付けたのでコードがweakと宣言されたが、私のものはStoryboardオブジェクトではなかった。ですから、私の不動産は、prepareForSegue:からの出口でARCによって解放され、ゼロにされました。それを非弱点にして固定しました。

+0

あなたは現在110%のホーミーです – sunrize920

関連する問題