将主数据传递给详细视图控制器的正确方法是什么?

问题描述:

我正在学习为iOS开发,同时构建一个简单的应用程序,该应用程序从数据库加载数据并将其显示为tableview,但我有一些我迄今为止无法理解的问题。 主 - 细节控制器的类是由我创建的,而不是由XCode模板创建的,如果这很重要的话。将主数据传递给详细视图控制器的正确方法是什么?

  1. 我尝试从主控制器的tableview数据传递给细节 控制器。数据就像一对字符串一样简单。我为此使用了 segue。在prepareForSegue方法我做 如下:

    if ([segue.identifier isEqualToString: @"DetailsSegue"]) { 
        DetailsViewController* dvc = (DetailsViewController*)segue.destinationViewController; 
        NSInteger selectedRow =[self.tableView indexPathForSelectedRow].row; 
        dvc.nameLabel.text = [NSString stringWithFormat:@"%@", 
            [[self.entitiesArray objectAtIndex:selectedRow name]]; 
        ... 
    } 
    

    的这里的问题是,dvc.nameLabelnil。我想, 可能是因为控制器尚未完全创建。 那么,dvc指针不是nil,但我没有看到我的 init方法中的日志,所以我的想法,它没有被初始化。

    我决定创建DetailsViewController 的实例变量和prepareForSegue设置:

    dvc->name = [NSString stringWithFormat:@"%@", 
          [[self.entitiesArray objectAtIndex: selectedRow] name]]; 
    

    ,然后我在viewDidLoad方法

    设置nameLabel属性,并将其实际工作!所以我想我将无法设置单个实例的实例变量。但我做到了。那有什么不对?我觉得这不是人们这样做的方式, 至于有一个多变量持有同样的事情似乎是多余的。

那么,什么是使用SEGUE到另一个控制器传递变量(在我的情况的NSString)的正确方法?

谢谢你们的帮助

+0

可能重复[在视图控制器之间传递数据](http://*.com/questions/5210535/passing-data-between-view-controllers) – 2014-11-03 16:49:22

如果你想数据,你有理由这样做。不保证UI元素在视图控制器的主视图完成加载之前被初始化,因此非UI变量相当常见。

对于更复杂的应用程序或您期望增长和维护的应用程序,更好的方法是创建组成应用程序数据模型的类(或类)。任何修改共享数据的内容都会向模型发送更新,并且需要使用共享数据的任何内容从模型中读取。该策略的许多积极结果中,视图控制器之间的串扰较少。

+0

这种方法中的模型类应该是单身? – rightaway717 2014-11-03 14:29:22

+0

它可以是一个单,也可以是一个对象,你可以从应用程序的委托获得,有点像应用程序窗口和根视图控制器的视图和控制器的层次结构。 – 2014-11-03 14:54:56

你的代码中的问题是你试图操纵其他VC视图。不要这样做。相反,您应该在目标视图控制器中创建属性以保存要显示的数据。

正如另一位海报所说,创建一个包含记录数据的类并通过该类是有意义的。你可能让你的主视图控制器的模型是这些对象的数组。主人将使用数据对象来填充表格视图。当用户点击某一行打开一个详细视图时,您需要将该数据对象的副本传递给prepareForSegue中的详细视图控制器。然后

详细视图控制器可如果需要的话对其进行编辑,并通过编辑的对象回到主视图控制器,如果用户已保存的更改,或者如果用户取消简单地丢弃被编辑的对象。

是的,你可以使用一个单独保存您的数据模型。

+0

+1指出如何正确地做到这一点,所以我在做了错误的方式。 – rightaway717 2014-11-03 16:52:16