在我的应用程序中,我使用故事板和转场,并且经常在执行转场之前将数据传递到目标视图控制器,如下所示:
- (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;
}
我会这样做 -
- (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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)