Ios 如何在MVC中正确读取模型?

Ios 如何在MVC中正确读取模型?,ios,objective-c,model-view-controller,Ios,Objective C,Model View Controller,我只是想知道在MVC类型的设置中读取模型的正确方法是什么。我知道它的目的是什么以及如何实现它,但在将它深入集成到更大的应用程序中时,我需要一些进一步的帮助 例如:我有一个应用程序,它有一个UITableViewController类,该类利用了其中的多个其他类,例如UITableViewCells的子类或自定义标题 如何从所有这些类访问模型文件的同一实例?我是否需要在原始UITableViewController类上设置属性,然后在子类之间传递它?或者我需要一个单例设置 跨需要查看相同信息的多个

我只是想知道在MVC类型的设置中读取模型的正确方法是什么。我知道它的目的是什么以及如何实现它,但在将它深入集成到更大的应用程序中时,我需要一些进一步的帮助

例如:我有一个应用程序,它有一个UITableViewController类,该类利用了其中的多个其他类,例如UITableViewCells的子类或自定义标题

如何从所有这些类访问模型文件的同一实例?我是否需要在原始UITableViewController类上设置属性,然后在子类之间传递它?或者我需要一个单例设置


跨需要查看相同信息的多个不同类访问同一模型文件的最佳方式是什么?

通常,您将在控制器和视图之间传递模型对象。例如,您的
UITableViewCell
子类应该接受来自表视图控制器的模型对象(通常作为属性)。然后,表视图控制器只负责将模型对象组织成行和节。它将其解释和渲染委托给单元

在某些情况下,可能有多个表视图控制器需要相同的模型对象组织。在这种情况下,可以创建表视图控制器可以查询的模型控制器

长期以来,我一直使用单例来管理模型存储,并让表视图控制器查询它。然而,最近我更倾向于将模型存储传递给表视图控制器。这两种方法都有权衡,到目前为止,我还没有发现哪一种方法显然是更好的解决方案;完全不同。单身人士更容易发展;传递实例更容易测试。但是在任何情况下,视图都不应该直接进入模型库;应该只将要显示的模型对象(通常只有一个)交给它们

您应该小心避免的一件事是让视图控制器与不是其直接父级或子级的其他视图控制器对话(即使如此,他们也应该将此最小化为初始设置和可能的“我完成了;结果如下”)。视图控制器不是数据的持有者。任何视图控制器都不应向其他控制器请求模型对象

是否需要在原始UITableViewController上设置属性 阶级

可能是的。如果您正在实现一个表视图,那么您可能有一个模型对象数组,因此您需要在
UITableViewController
子类中声明一个
NSArray
属性。如果其他类必须访问相同的模型对象,则需要传递它们。在这种情况下,单身人士不是一个好的选择

考虑这个简单的例子。您的模型对象被称为
Person
,并且具有一些属性,这些属性包含关于某人的信息(姓名、生日、照片等)。在
PersonListViewController
(您的
UITableViewController
的子类)中,您有一个
NSArray
属性,其中包含所有这些
Person
实例
当用户选择其中一个时,您将初始化一个
PersonDetailsViewController
UITableViewController
的另一个子类)。此视图控制器将有一个
Person
属性(它将显示有关该属性的信息)。因此,在初始化新的
PersonDetailsViewController
后,您将所选的
Person
实例传递给它,以便它可以显示正确的信息。

您可能还有一个子类
UITableViewController
。例如,以一种奇特的方式展示某人的生日。但是,此
BirthdayTableViewCell
类不需要(或应该)访问
Person
实例。它只需要有一个
NSDate
属性,您可以在设置表视图时从
PersonDetailsViewController
设置该属性。

最简单、最安全的方法是将数据模型的指针传递给其他类。感谢您的回复!在我的例子中,我需要在用户从UITableViewCell中选择对象后执行某些操作。问题是这些单元格是子类,所以我无法从该子类中将该操作发送到原始TableViewController。那么,我应该有一个模型类,它本质上具有公共方法来在两者之间进行通信吗?就像在模型中设置为-1的属性一样,如果我需要触发一个动作,我会将其设置为1?然后我的TableViewController就可以读取并执行操作了?我不知道你想做什么。解释您的具体用例可能会有所帮助。我有一个UITableViewCell,其中有一个UIImageView。当用户点击UIImageView时,我希望显示UIActionSheet。该操作表需要显示在UITableViewController中。我想问的是,是否有一个好的方法可以通过模型来实现这一点。具有默认设置为-1的属性。如果我点击单元格中的UIImage,我会将其设置为1。然后在我的UITableView中,我可以查看模型,看到它现在是1,这意味着我显示了一个操作表。在行动表被撤销后,我将其设置回-1。底线:点击UITableViewCell UIImage后需要显示操作表。我认为这个问题没有明确的答案。有多种方法可以做到这一点。我仍然不太理解你的方式,但这里有一些想法,我将如何处理这个问题。在
tableView:cellforrowatinexpath:
中设置单元格时,确保在点击图像时调用
UITableViewController
子类中的方法。您可以通过使用
ui按钮
而不是
UIImageView
来实现这一点,并定义正确的目标/动作对,在
UIImageView
或子类
UIImageV上方放置一个不可见的
ui按钮