【问题标题】:How to read from model properly in MVC?如何在 MVC 中正确读取模型?
【发布时间】:2014-02-27 18:21:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 最简单和最安全的方法是将数据模型的指针传递给其他类。

标签: ios objective-c model-view-controller


【解决方案1】:

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

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

我长期以来一直使用单例来管理我的模型存储,并让表视图控制器查询它。然而,最近,我更倾向于将模型存储传递给表视图控制器。无论哪种方式都需要权衡取舍,到目前为止,我还没有发现任何一种显然是更好的解决方案。只是不同。单例更容易开发;传递实例更容易测试。但无论如何,视图不应该直接进入模型存储;他们应该只收到他们要展示的模型对象(通常只有一个)。

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

【讨论】:

    【解决方案2】:

    我需要在原来的 UITableViewController 上设置一个属性吗 类

    可能是的。如果你正在实现一个表格视图,你可能有一个模型对象的数组,所以你应该在你的UITableViewController 子类中声明一个NSArray 属性。如果其他类必须访问相同的模型对象,您需要传递它们。在这种情况下,单例不是一个好的选择。

    考虑这个简单的例子。您的模型对象称为Person,并具有一些保存有关人的信息(姓名、生日、照片等)的属性。在您的PersonListViewController(您的UITableViewController 的子类)中,您有一个包含所有这些Person 实例的NSArray 属性。
    当用户选择其中一个时,您初始化一个PersonDetailsViewControllerUITableViewController 的另一个子类)。此视图控制器将有一个 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:cellForRowAtIndexPath: 中设置单元格时,请确保在点击图像时调用UITableViewController 子类中的方法。您可以通过使用UIButton 而不是UIImageView 来做到这一点,并定义正确的目标/动作对,在您的UIImageView 或子类UIImageView 上方放置一个不可见的UIButton 以响应触摸。
    • 然后实现该方法并显示操作表。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2015-09-25
    • 2020-08-17
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多