在我的应用程序中,我使用了故事板和segues,我经常在执行segue之前将数据传递到目标视图控制器,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
除了在一个地方外,它无处不在。选择器被调用,数据被设置,但是当segue完成并且目标控制器出现时,它没有我刚刚设置的数据。在源视图控制器和目标视图控制器中打印视图控制器的id之后,我发现上面代码中的segue.destinationViewController
是视图控制器的一个不同实例,而不是显示的实例。这是怎么回事?
[更新1]
我查看了目标视图控制器的生命周期,它首先在segue执行期间加载,但是我在它上面设置了属性!这意味着,当我在其上调用performSelector
时,视图控制器对象未初始化!这就是我设置的数据不坚持的原因。我不明白为什么会这样,为什么同样的方法适用于我的应用程序的其他部分。
[更新2]
根据请求发布setMyData
代码。起初我根本没有这个方法,因为locationToOpen
是一个公共属性。我只添加它以确保它被调用并打印调试信息。
- (void)setMyData:(MyData *)myData
{
DLog(@"self: %@", (id)self);
_myData = myData;
}
答案 0 :(得分: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
答案 1 :(得分:4)
我有同样的问题。原来,我在prepareForSegue:代码中设置的目标ViewController属性被声明为弱,因为我已经从InterfaceBuilder自动创建的属性中复制并粘贴了该属性,但我的不是Storyboard对象。所以我的财产在从prepareForSegue退出时被ARC释放并归零:使它成为一个非弱的属性来修复它。
答案 2 :(得分:0)
我有一个类似的问题,我在ViewController上做了一些奇怪的改变, 看了一下之后,似乎segue创建了一个新的ViewController。
为解决数据传递问题,我使用了通知。
答案 3 :(得分:0)
我知道这个帖子已经过时了,应该找到解决方案。但由于最终的解决方案没有在这里发布,我想列出一个可能的根本原因(在我的情况下是一个)。我有同样的问题,试图在segue的目标视图控制器中设置变量。根本原因是我忘了实例化([[Class alloc] init])对象变量。在我的情况下我需要它,因为我设置对象的属性而不是指向其他对象。希望这有帮助。