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)
我会这样做 -
- (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)
| 归档时间: |
|
| 查看次数: |
20937 次 |
| 最近记录: |