自从切换到 Storyboard后,我通过加载 View Controller
[self performSegueWithIdentifier:@"identifier" sender:self]
这非常有效。现在,如果我想在目标 View Controller 上设置任何属性,我可以实现方法 prepareForSegue:sender:
并设置我需要设置的属性。一切都按预期进行,没有任何问题。
自从我开始使用这种方法而不是旧方法
MyViewController *vc = ....
vc.prop = @"value";
[self.navigationController pushViewController:vc];
我觉得将参数传递到目标 View Controller 有点棘手,特别是当您尝试设置的值不仅仅是静态值时。
例如,我有一个按钮可以从服务器获取一些数据。当数据返回时,它创建一个新对象,然后呈现一个新的 View Controller 来显示该对象。为此,我调用 performSegueWithIdentifier:sender:
,但这就是结束。我的对象现在已被释放并且不再存在,并且我无法将其传递给 prepareForSegue:sender:
方法,除非我将其存储在实例变量中。
这感觉非常可怕,因为该对象的持续时间不会超过此操作,并且与我当前 View Controller 中的其他任何内容都没有关系。
在这种情况下,我知道我可以非常简单地请求新 View Controller 中的数据,但这只是一个示例。
我的问题是,是否有另一种方法可以做到这一点而又不会让人感觉那么老套?我可以将此数据获取到目标 View Controller 而不将其存储在实例变量中吗?
我知道我仍然可以使用旧方法,但如果可以的话,我想坚持使用 Storyboard方法。
最佳答案
那么,performSegueWithIdentifier:sender
的 sender
参数与 prepareForSegue:sender
收到的参数相同。因此,如果您想将变量发送到 prepareForSegue:sender
,sender
就是您的 friend 。对于您的情况:
SomeViewController.m
-(void)aMethodThatDownloadsSomeDataFromServer {
NSString *exampleData = [self someDataThatIDownloaded];
[self performSegueWithIdentifier:@"yourSegueIdentifier" sender:exampleData];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if(segue.identifier isEqualToString:@"yourSegueIdentifier"]) {
if([sender isKindOfClass:[NSString class]]) { //maybe you want to send different objects
segue.destinationViewController.stringProperty = sender;
}
else {
segue.destinationViewController.objectPorperty = sender;
}
}
}
关于ios - 将数据传递到 segue 目的地,无需 iVar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18313283/