有关如何存储iPhone应用程序主列表数据的建议,如下所示?
NavigationController
基于现在假设实施是(粗略概述):
* MainView
- appDelegate(暂停UIWindow
& UINavigationController
)
* RootViewController
- 主要项目列表的表格视图(?变量在这里?)
* EditViewController
- 输入要添加到主列表的文本
* DetailViewController
- 显示记录的详细信息
问题 - 在哪里举行保留主要项目列表的NSArray
?它应该在显示它的表视图所在的RootViewController
吗?或者它应该在ApplicationDelegate
中更高?我注意到当您从RootViewController
转到EditViewController
时,在此编辑视图中您必须将项添加到数组中,因此EditViewController
中的代码更容易从AppDelegate
(而不是RootViewController
)访问主阵列?
(注意 - 仍然没有制作具有特定模型对象的应用程序,重新使用MVC,所以不确定这是否应该出现在图片中。)
答案 0 :(得分:3)
您的数据将成为表视图的数据源,虽然它不必,但包含表视图的视图控制器通常会执行数据源的角色。视图控制器也可以是EditViewController的委托,因此EditViewController会向它发送一条消息,以便它可以更新数组。
Apple的CoreDataBooks示例项目显示了类似的架构。你可能想看看。
将数组放在应用程序委托中通常不是一个好主意。虽然它可以为您提供一些便利,但现在您的课程完全依赖于您的应用程序委托。
您的表格视图显示您的数据。这对应于MVC设计模式中的查看。我假设RootViewController
是表视图的视图控制器,它在模式中充当控制器。您尚未确定其位置的数据对应于模型。 RootViewController
的作用是连接模型和查看。
MVC模式的理想或原因是隔离模型和视图,因此模型可以与具有适当控制器的其他视图一起使用,并且视图也可以与具有适当控制器的其他模型一起使用。例如,您的RootViewController
将为表格视图提供数据。它将以表格视图的语言指定数据,例如部分和行的数量,单元格的内容等。如果要以不同的方式显示数据,例如图形,控制器将访问相同的数据(模型)并为图形视图提供不同的表示形式相同的数据。模型不需要改变,视图也不需要改变。您只为模型和视图的每个组合编写控制器。
因此,理想情况下,您将拥有该模型的不同类。在这个类中,您将存储数组,并为控制器提供通用接口,可以与数据进行交互。
但是,它通常不是那么必要,因为你不太可能经常再次使用模型类,或者因为模型本身太简单所以它可以在任何地方轻松实现。例如,如果表的数据是一个简单数组,则NSArray对象通常足以用于模型的角色。因此,有一个想法是将控制器和模型组合成一个对象。
这就是为什么表视图控制器经常充当表视图的数据源是有道理的。
但是,将数据存储在应用程序委托中是一个完全不同的想法。现在,应用程序委托成为您的模型,但这没有意义,因为应用程序委托仅用于特定的应用程序。为什么你会有一个完全依赖于单个应用程序的单独模型对象?此外,如果您的表视图直接与应用程序委托交互,则意味着现在您的视图无法用于其他应用程序,因为它现在取决于特定应用程序的应用程序委托。
通常,人们想要在应用程序委托中拥有数据的原因是,应用程序中的任何对象都可以使用[UIApplication sharedApplication].delegate
轻松访问应用程序委托。 M-V-C关系并不总是很简单。例如,您的EditViewController还需要访问相同的模型。为此,您必须编写一些代码以使表格视图和编辑视图都可以访问模型。如果您在应用程序委托中拥有数据,则无需执行任何操作,因为您可以通过访问应用程序委托来神奇地访问该数组。
但这就是全部。以编程时间节省几分钟,以破坏软件架构为代价。我不是原教旨主义者,有时我会使用应用程序委托来存储一些数据,因为我绝对不确定提供格式良好的接口是不值得的,但这种情况很少见。
那么如何将编辑视图连接到合并到表视图控制器的数据?可能有多种方式。我之前建议的是让编辑视图控制器对表视图控制器(delegate
)具有弱引用并发送定义的消息,例如- (void)editViewController:(EditViewController *editViewController) didFinishEditing:(id) someData
。通过这种方式,您可以将此编辑视图控制器与其他一些视图控制器一起使用,只要它们使用相同的协议即可。但是其他人可能会为它实现不同的接口。
答案 1 :(得分:1)
你需要存储在appDelegate中,因为你可以使用anyviewcontroller中的数据。但是如果你使用rootviewController,那么你只能将数据发送到下一个ViewController,而不是直接发送到第二个或第三个ViewController。 希望它会对你有所帮助。
祝你好运