segue:目标视图控制器古怪

Mac*_*tle 7 uiviewcontroller ios ios5 uistoryboardsegue

在我的应用程序中,我使用故事板和segues,我经常在执行segue之前将数据传递到目标视图控制器,如下所示:

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

除了在一个地方,它无处不在.选择器被调用,数据被设置,但是当segue完成并且目标控制器出现时,它没有我刚刚设置的数据.在源视图控制器和目标视图控制器中打印视图控制器的ID后,我发现segue.destinationViewController上面的代码中的视图控制器的实例与显示控制器的实例不同.这里发生了什么?

[更新1] 我查看了目标视图控制器的生命周期,它首先在segue执行期间加载,但是我在它上面设置了属性!这意味着,当我调用performSelector它时,视图控制器对象没有初始化!这就是我设置的数据不坚持的原因.我不明白为什么会这样,为什么同样的方法适用于我的应用程序的其他部分.

[更新2]setMyData按要求 发布代码.起初我根本没有这种方法,因为它locationToOpen是一个公共财产.我只添加它以确保它被调用并打印调试信息.

- (void)setMyData:(MyData *)myData
{
    DLog(@"self: %@", (id)self);
    _myData = myData;
}
Run Code Online (Sandbox Code Playgroud)

Aru*_*Das 5

我会这样做 -

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

        dest.myData = self.myData; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在DestinationViewController.h中,您应该创建一个属性 -

#import <UIKit/UIKit.h>

@interface DestinationViewController : UIViewController

@property (nonatomic, strong) NSObject *myData;


@end
Run Code Online (Sandbox Code Playgroud)

此外,请确保在DestinationViewController.m中合成myData属性 -

@interface DestinationViewController ()

@end

@implementation DestinationViewController

@synthesize myData = _myData;

// other methods here

@end
Run Code Online (Sandbox Code Playgroud)