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

时间:2014-11-03 14:13:11

标签: ios objective-c uitableview initialization

我正在研究iOS开发,同时构建一个从数据库加载数据并将其显示为tableview的简单应用程序,我遇到了一些我目前无法理解的问题。 如果重要的话,主 - 细节控制器的类是由我创建的,而不是由XCode模板创建的。

  1. 我尝试将数据从主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.nameLabelnil。我猜,那 可能是因为尚未完全创建控制器。 好吧,dvc指针不是nil,但我没有看到我的日志 init方法,所以我认为它没有初始化。

    我决定创建一个DetailsViewController的实例变量 并在prepareForSegue设置它:

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

    然后我在nameLabel方法

    中设置viewDidLoad属性

    它确实有效!所以我想我无法设置一个单元化实例的实例变量。但我做到了。那有什么不对?我觉得这不是人们这样做的方式, 至于有一个变量,似乎持有相同的东西 多余的。

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

    谢谢你们的帮助

2 个答案:

答案 0 :(得分:1)

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

正如另一张海报所说,创建一个包含记录数据的类并传递它是有意义的。您可能将主视图控制器的模型设置为这些对象的数组。主服务器将使用数据对象来填充表视图。当用户单击某行以打开详细视图时,您将该数据对象的副本传递给prepareForSegue中的详细视图控制器。

如果需要,详细视图控制器可以编辑它,如果用户保存更改,则将编辑后的对象传递回主视图控制器,或者如果用户取消,则简单地丢弃编辑过的对象。

是的,您可以使用单例来保存数据模型。

答案 1 :(得分:0)

如果您想要传递数据,那么您就是在合理地做到这一点。在视图控制器的主视图加载完成之前,不保证UI元素被初始化,因此非UI变量相当常见。

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