0

关于在哪里存储 iPhone 应用程序的主列表数据的任何建议,如下所示?

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

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

问题-NSArray保存主要项目列表的位置在哪里?它应该在RootViewController显示它的表视图存在的地方吗?还是应该更高ApplicationDelegate?我注意到,当您从RootViewController到时,在此编辑视图中您必须将项目添加到数组中,因此 中的代码从(而不是)访问主数组EditViewController会更容易吗?EditViewControllerAppDelegateRootViewController

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

4

2 回答 2

3

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

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

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


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

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

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

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

这就是为什么你的表视图控制器经常充当表视图的数据源是有意义的。

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

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

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

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

于 2011-02-22T05:11:44.453 回答
1

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

祝你好运

于 2011-02-22T05:10:08.573 回答