【问题标题】:where to store main table view data? (appDelegate or rootViewController)在哪里存储主表视图数据? (appDelegate 或 rootViewController)
【发布时间】:2011-07-01 17:35:16
【问题描述】:

关于在哪里存储类似以下 iPhone 应用程序的主列表数据的任何建议?

  • NavigationController 基于
  • 1 级(主屏幕)是项目列表。因此它使用表格视图(项目表)
  • Level 2_EDIT:是您可以通过单击 EDIT 从主屏幕访问的视图。在这里您可以添加要添加到主视图列表的文本
  • Level 2_DETAIL:是您可以通过单击单元格从主屏幕访问的视图。

现在假设实现是(粗略的概述): * MainView - appDelegate (持有UIWindow & UINavigationController) * RootViewController - 主要项目列表的表格视图(?这里的变量?) * EditViewController - 输入要添加到主列表的文本 * DetailViewController - 显示记录详情

问题 - 保存主要项目列表的NSArray 放在哪里?它应该在显示它的表视图存在的RootViewController 中吗?还是应该在ApplicationDelegate 中更高?我注意到,当您从 RootViewController 转到 EditViewController 时,在此编辑视图中您必须将项目添加到数组中,因此 EditViewController 中的代码可以更容易地从AppDelegate(相对于RootViewController)?

(注意 - 还没有制作具有特定模型对象的应用程序,重新 MVC,所以不确定这是否应该出现在图片中。)

【问题讨论】:

    标签: iphone uinavigationcontroller uitableview uiapplicationdelegate


    【解决方案1】:

    您需要存储在appDelegate中,因为您可以在任何viewcontroller中获取数据。但是如果您使用rootviewController,那么您只能将数据发送到下一个ViewController,而不是直接发送到第二个或第三个ViewController。 希望对你有帮助。

    祝你好运

    【讨论】:

    • 谢谢 - 介意我问你在哪里看到模型类在这里发挥作用?
    【解决方案2】:

    您的数据成为表视图的数据源,虽然它不是必须的,但包含表视图的视图控制器通常会扮演数据源的角色。视图控制器也可以是 EditViewController 的委托,因此 EditViewController 会向它发送一条消息,以便它可以更新数组。

    Apple 的 CoreDataBooks 示例项目显示了类似的架构。你可能想看看。

    在应用程序委托中包含数组通常不是一个好主意。尽管它可以给您带来一点便利,但现在您的类完全依赖于您的应用程序委托,这是不必要的。


    您的表格视图显示您的数据。这对应于 MVC 设计模式中的 View。我假设RootViewController 是表视图的视图控制器,它在模式中充当 Controller。您的数据(位置尚未确定)对应于 ModelRootViewController 的作用变成了连接 ModelView

    MVC 模式的理想,或者说原因是把模型和视图隔离开来,这样模型可以和其他带有适当控制器的视图一起工作,而视图也可以和其他带有适当控制器的模型一起工作。例如,您的RootViewController 将为表格视图提供数据。它将以表格视图的语言指定数据,例如部分和行的数量,单元格的内容等。如果您想以不同的方式呈现数据,例如图形,您的控制器将访问相同的数据(模型)并为图形视图提供不同的表示形式相同的数据。模型不需要改变,视图也不需要改变。您只需为模型和视图的每个组合编写控制器。

    因此,理想情况下,您将拥有一个不同的模型类。在这个类中,你将存储数组,并为控制器提供一个通用的接口来与数据进行交互。

    但是,这通常不是必需的,因为您不太可能再次经常使用模型类,或者因为模型本身过于简单,因此可以在任何地方轻松实现。例如,如果您的表数据是一个简单的数组,则 NSArray 对象通常足以满足模型的角色。因此,这里出现了一个想法,将控制器和模型组合成一个对象

    这就是为什么您的表视图控制器经常充当表视图的数据源的原因。

    但是,将数据存储在应用程序委托中是一个完全不同的想法。现在应用程序委托成为您的模型,但这没有意义,因为应用程序委托仅用于特定应用程序。为什么会有一个完全依赖于单个应用程序的单独模型对象?此外,如果您的表视图直接与应用程序委托进行交互,则意味着您的视图现在也不能用于其他应用程序,因为它现在依赖于特定应用程序的应用程序委托。

    人们想要在应用程序委托中包含数据的原因通常是,应用程序中的任何对象都可以通过使用[UIApplication sharedApplication].delegate 轻松访问应用程序委托。 M-V-C 关系并不总是很简单。例如,您的 EditViewController 也需要访问相同的模型。为此,您必须编写一些代码以使表格视图和编辑视图都可以访问模型。如果您在应用程序委托中有数据,则无需执行任何操作,因为您可以通过访问应用程序委托神奇地访问数组。

    但仅此而已。以破坏软件架构为代价,节省了几分钟的编码时间。我不是原教旨主义者,当我完全确定不值得提供格式良好的接口时,我有时会使用应用程序委托来存储一些数据,但这种情况很少见。

    那么您应该如何将您的编辑视图连接到合并到表格视图控制器中的数据?可能有多种方式。我之前的建议是让编辑视图控制器对表格视图控制器(delegate)进行弱引用并发送定义的消息,例如- (void)editViewController:(EditViewController *editViewController) didFinishEditing:(id) someData。这样,您可以将此编辑视图控制器与其他一些视图控制器一起使用,只要它们使用相同的协议即可。但其他人可能会为它实现不同的接口。

    【讨论】:

    • @MHC - 哦,有点明白你在说什么,但是将你的数据作为控制器数据源的一部分有什么缺点吗?例如,如果您使用不需要数据的不同控制器/视图(例如帮助页面、配置页面)怎么办。在应用程序的整个生命周期内保留此类数据方面是否存在任何问题?作为初学者,我还建议查看 CoreData 示例吗? (也许我现在会更加困惑)
    • 不确定你在评论中问的是什么(最后一部分除外),这可能表明我的答案不清楚,所以让我详细说明一下我的答案。
    • 谢谢 - 我想我想知道是否存在一个特定控制器持有对您需要在应用程序的整个生命周期中使用的模型对象的引用的问题?例如,当控制器对象没有被主动用于显示视图时,它们是否会被丢弃(/丢失状态)?所以我想知道 AppDelegate 是否会更好地保留对您的模型对象的引用以确保它保持不变..?
    • 视图控制器通常不会被 Cocoa 的默认行为保留/释放。如果你需要保留一个视图控制器(通常你会这样做),你必须保留它(根视图控制器通常由应用程序委托保留,其他视图控制器由根视图控制器或其他超级视图控制器保留。它可能由笔尖加载逻辑通过插座保留)。除非你释放它,否则视图控制器永远不会被释放。
    • 很棒的 MHC - 如果可以的话,我会加倍支持你 - 我可以在你的最后一段中询问“编辑视图控制器发送消息”,这将如何工作 - 就像 editViewController 如何获得主 TableView 控制器的句柄?我还没有实现表视图单击一行以启动到单独的控制器,但我认为有一种方法可以在那时传递引用?
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2011-12-02
    • 2019-07-31
    • 2014-08-11
    相关资源
    最近更新 更多