我正在研究iOS开发,同时构建一个从数据库加载数据并将其显示为tableview的简单应用程序,我遇到了一些我目前无法理解的问题。 如果重要的话,主 - 细节控制器的类是由我创建的,而不是由XCode模板创建的。
我尝试将数据从主tableview控制器传递给detail
控制器。数据就像几个字符串一样简单。我用
为此目的。在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]];
然后我在nameLabel
方法
viewDidLoad
属性
它确实有效!所以我想我无法设置一个单元化实例的实例变量。但我做到了。那有什么不对?我觉得这不是人们这样做的方式, 至于有一个变量,似乎持有相同的东西 多余的。
那么使用segue到另一个控制器传递变量(在我的情况下是NSString)的正确方法是什么?
谢谢你们的帮助
答案 0 :(得分:1)
您的代码中的问题是您正在尝试操纵其他VC视图。不要那样做。相反,您应该在目标视图控制器中创建属性以保存要显示的数据。
正如另一张海报所说,创建一个包含记录数据的类并传递它是有意义的。您可能将主视图控制器的模型设置为这些对象的数组。主服务器将使用数据对象来填充表视图。当用户单击某行以打开详细视图时,您将该数据对象的副本传递给prepareForSegue中的详细视图控制器。
如果需要,详细视图控制器可以编辑它,如果用户保存更改,则将编辑后的对象传递回主视图控制器,或者如果用户取消,则简单地丢弃编辑过的对象。
是的,您可以使用单例来保存数据模型。
答案 1 :(得分:0)
如果您想要传递数据,那么您就是在合理地做到这一点。在视图控制器的主视图加载完成之前,不保证UI元素被初始化,因此非UI变量相当常见。
对于更复杂的应用程序或您希望增长和维护的应用程序,更好的方法是创建构成应用程序数据模型的类(或类)。修改共享数据的任何内容都会向模型发送更新,并且任何需要使用共享数据的内容都会从模型中读取。在该策略的许多积极结果中,一个是视图控制器之间的串扰较少。