将主数据传递给详细视图控制器的正确方法是什么?
我正在学习为iOS开发,同时构建一个简单的应用程序,该应用程序从数据库加载数据并将其显示为tableview,但我有一些我迄今为止无法理解的问题。 主 - 细节控制器的类是由我创建的,而不是由XCode模板创建的,如果这很重要的话。将主数据传递给详细视图控制器的正确方法是什么?
-
我尝试从主控制器的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.nameLabel
是nil
。我想, 可能是因为控制器尚未完全创建。 那么,dvc
指针不是nil
,但我没有看到我的init
方法中的日志,所以我的想法,它没有被初始化。我决定创建DetailsViewController 的实例变量和
prepareForSegue
设置:dvc->name = [NSString stringWithFormat:@"%@", [[self.entitiesArray objectAtIndex: selectedRow] name]];
,然后我在
viewDidLoad
方法设置
nameLabel
属性,并将其实际工作!所以我想我将无法设置单个实例的实例变量。但我做到了。那有什么不对?我觉得这不是人们这样做的方式, 至于有一个多变量持有同样的事情似乎是多余的。
那么,什么是使用SEGUE到另一个控制器传递变量(在我的情况的NSString)的正确方法?
谢谢你们的帮助
如果你想通数据,你有理由这样做。不保证UI元素在视图控制器的主视图完成加载之前被初始化,因此非UI变量相当常见。
对于更复杂的应用程序或您期望增长和维护的应用程序,更好的方法是创建组成应用程序数据模型的类(或类)。任何修改共享数据的内容都会向模型发送更新,并且需要使用共享数据的任何内容从模型中读取。该策略的许多积极结果中,视图控制器之间的串扰较少。
这种方法中的模型类应该是单身? – rightaway717 2014-11-03 14:29:22
它可以是一个单,也可以是一个对象,你可以从应用程序的委托获得,有点像应用程序窗口和根视图控制器的视图和控制器的层次结构。 – 2014-11-03 14:54:56
你的代码中的问题是你试图操纵其他VC视图。不要这样做。相反,您应该在目标视图控制器中创建属性以保存要显示的数据。
正如另一位海报所说,创建一个包含记录数据的类并通过该类是有意义的。你可能让你的主视图控制器的模型是这些对象的数组。主人将使用数据对象来填充表格视图。当用户点击某一行打开一个详细视图时,您需要将该数据对象的副本传递给prepareForSegue中的详细视图控制器。然后
详细视图控制器可如果需要的话对其进行编辑,并通过编辑的对象回到主视图控制器,如果用户已保存的更改,或者如果用户取消简单地丢弃被编辑的对象。
是的,你可以使用一个单独保存您的数据模型。
+1指出如何正确地做到这一点,所以我在做了错误的方式。 – rightaway717 2014-11-03 16:52:16
可能重复[在视图控制器之间传递数据](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – 2014-11-03 16:49:22