首先,一点背景.我是iOS开发的新手,我已经在.Net上呆了很长时间了,这可能就是为什么我甚至都会问这个问题,但是这里也是如此.
基本设置是这样的.你有一个带有RootViewController的UINavigationController,我们将调用MasterViewController.当在这个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设置为segue到DetailsViewController,然后在代码中执行以下操作:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]]; }
我的问题基本上是这样的:对我而言,旧方法对我来说感觉更清洁了.您对要推送到导航堆栈的ViewController的类型非常明确,您可以在其上轻松设置属性.但是在新方法中,destinationViewController的类型为id(出于显而易见的原因),它对我来说感觉不那么干净.再次,这可能是我的.Net方面出现,但这在iOS中常见吗?只是使用id并谨慎对待风?
解决方法
使用Storyboard,您可以为segue分配命名标识符,
选择segue,然后在属性检查器中,您可以为segue标识符添加名称.
选择segue,然后在属性检查器中,您可以为segue标识符添加名称.
在prepareForSegue方法中,您应该检查此标识符,因此您将明确知道将要执行哪个segue以及destinationViewController将是什么.
if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) { DetailsViewController *dvc = (DetailsViewController *) segue.destinationViewController; // Set the DVC's properties }