首先,介绍一下背景。我是 iOS 开发的新手,我已经在 .Net 领域工作了很长时间,这可能就是我问这个问题的原因,但现在就开始吧。
基本设置是这样的。您有一个 UINavigationController
和一个我们称之为 MasterViewController
的 RootViewController
。当此 MasterViewController 上发生某些操作时,我们希望深入到 DetailsViewController
。但是,我们还想将一些数据传递给 DetailsViewController
。
据我了解,在以前版本的 SDK(iOS 5 之前)中,方法与此类似:
@implementation MasterViewController
-(IBAction)someAction
{
DetailsViewController *dvc = [[DetailsViewController alloc]initWithNibName:@"DetailsView" bundle:nil];
dvc.someDataProp = [self getSomeDataSomeHow];
[[self navigationController] pushViewController:dvc animated:YES];
}
@end
但是现在,在 iOS 5 中,这似乎是使用 Storyboard 和 segues 完成的。在 XCode 中,您设置从 MasterViewController 到 DetailsViewController 的转接,然后在代码中执行如下操作:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]];
}
我的问题基本上是这样的:不知何故,旧方法对我来说感觉更清晰。您对要推送到导航堆栈的 ViewController
类型非常明确,并且可以轻松地在其上设置属性。不过在新方法中,destinationViewController
是 id
类型(原因很明显),我觉得它不太干净。同样,这可能是我的 .Net 方面出现了,但这在 iOS 中常见吗?只使用 id 并抛开谨慎?
最佳答案
使用 Storyboard,您可以为 segue 分配一个命名标识符, 选择 segue,然后在属性检查器中,您可以为 segue 标识符添加名称。
并且在 prepareForSegue 方法中,您应该检查此标识符,因此您将明确知道将要执行哪个转场以及 destinationViewController 将是什么。
if ([segue.identifier isEqualToString:@"My First Segue Identifier"])
{
DetailsViewController *dvc = (DetailsViewController *) segue.destinationViewController;
// Set the DVC's properties
}
关于ios - 将数据从一个 View Controller 传递到另一个; iOS <=4 对比 iOS 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694173/