微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

首先,一点背景.我是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标识符添加名称.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐