将数据从一个视图控制器传递到另一个视图 iOS <= 4 vs iOS 5

BFr*_*ree 7 uinavigationcontroller ios ios5

首先,一点背景.我是iOS开发的新手,我已经在.Net上呆了很长时间了,这也许就是为什么我甚至会问这个问题,但是这里也是如此.

基本设置是这样的.你有UINavigationController一个RootViewController,我们会打电话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
Run Code Online (Sandbox Code Playgroud)

然而,现在,在iOS 5中,似乎现在使用Storyboard和segues完成.在XCode中,您将从MasterViewController设置为segue到DetailsViewController,然后在代码中执行以下操作:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]];
}
Run Code Online (Sandbox Code Playgroud)

我的问题基本上是这样的:老方法对我来说感觉更清洁了.您正在非常清楚地了解ViewController您正在推送到导航堆栈的类型,并且您可以轻松地在其上设置属性.然而,在新的方法中,destinationViewController是类型的id(出于显而易见的原因),它对我来说感觉不那么干净.再次,这可能是我的.Net方面出现,但这在iOS中常见吗?只是使用id并谨慎对待风?

Den*_*ews 6

使用Storyboard,您可以为segue分配命名标识符,选择segue,在属性检查器中,您可以为segue标识符添加名称.

在prepareForSegue方法中,您应该检查此标识符,因此您将明确知道将要执行哪个segue以及destinationViewController将是什么.

if ([segue.identifier isEqualToString:@"My First Segue Identifier"])
{    
   DetailsViewController *dvc = (DetailsViewController *) segue.destinationViewController;
   // Set the DVC's properties 
}
Run Code Online (Sandbox Code Playgroud)