7

私のアプリでは、ストーリーボードとセグエを使用しています。次のように、セグエを実行する前に宛先のビュー コントローラーにデータを渡すことがよくあります。

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

1 か所を除いてどこでも機能します。セレクターが呼び出され、データが設定されますが、セグエが完了して宛先コントローラーが表示されると、設定したばかりのデータがありません。ソースと宛先の両方のView ControllerでView ControllerのIDを出力した後、segue.destinationViewController上記のコードは、表示されるものとは異なるView Controllerのインスタンスであることがわかりました。何が起きてる?

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

[UPDATE 2]setMyDataリクエストによる コードの投稿。locationToOpenはパブリック プロパティであるため、最初はこのメソッドをまったく持っていませんでした。確実に呼び出され、デバッグ情報を出力するために追加しただけです。

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

4 に答える 4

5

私は次のようにします-

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

        dest.myData = self.myData; 
    }
}

そして、DestinationViewController.h で、プロパティを作成する必要があります -

#import <UIKit/UIKit.h>

@interface DestinationViewController : UIViewController

@property (nonatomic, strong) NSObject *myData;


@end

また、必ず DestinationViewController.m で myData プロパティを合成してください -

@interface DestinationViewController ()

@end

@implementation DestinationViewController

@synthesize myData = _myData;

// other methods here

@end
于 2012-12-26T12:31:24.083 に答える
4

これと同じ問題がありました。私の prepareForSegue: コードで設定していたターゲットの ViewController プロパティは、InterfaceBuilder が自動作成したものからプロパティをコピーして貼り付けたため、脆弱であると宣言されましたが、私のものは Storyboard オブジェクトではありませんでした。したがって、私のプロパティは、prepareForSegue: の終了時に ARC によって解放され、ゼロにされていました。それを非弱いプロパティにすることで修正されました。

于 2015-05-15T12:45:28.660 に答える
0

セグエを行っていたViewControllerが奇妙な時点で変更されるという同様の問題がありました。少し見回した後、セグエが新しいViewControllerを作成したようです。

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

于 2013-08-07T17:42:35.443 に答える