在iPhone MVC应用中处理用户偏好的最佳实践是什么?

3
我正在开发我的第一个iPhone应用程序,当我实现用户偏好设置时,我有一些关于最佳实现方式的问题。
假设基本的MVC模式:MainView显示存储在Model对象中的数据;MainViewController处理应用程序逻辑。
对于选项,我有一个OptionsView和一个OptionsViewController。RootViewController处理Main和Options视图的交换。
首先,关于选项数据怎么办?我是否需要制作一个派生自NSOjbect的类来存储它们(OptionsModel)?或者一个简单的NSDictionary就足够了?
其次,谁拥有选项数据?它们是应用程序偏好设置,但将它们存储在AppDelegate中似乎不对。MainViewController主要关心选项,而OptionsViewController需要编辑它们,但这些人彼此不知道,也可能不应该知道。RootViewController知道两者,所以他在传递选项之间处于良好的位置,但这似乎也是错误的。
最后,MainViewController经常需要访问选项。他应该每次调用选项模型来获取某个选项,还是缓存自己的副本?我不喜欢额外的开销来检索选项数据,但让MainViewController拥有可以失去同步的副本也不是很吸引人。

briankc,非常有帮助,谢谢。但我仍然想知道选项从编辑它们的OptionsViewController通信到需要知道它们何时更改的MainViewController的方式。OptionsViewController可以通过NSUserDefaults将它们写入,然后发送NSNotification,这将被MainViewController接收,然后从NSUserDefaults中读取选项。这合理吗? - zpasternack
1个回答

8
请看NSUserDefaults。它是一种特定用途的字典样式集合类。
您可以这样存储和检索默认值:
// Fetch a default
BOOL deleteBackup = [[NSUserDefaults standardUserDefaults] boolForKey:@"DeleteBackup"];

// Save a default
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"DeleteBackup"];

NSUserDefaults会自动处理从磁盘读取和序列化的工作。

关于你的另一个问题,这取决于您应用程序的整体架构。在OptionsViewController完成后发送通知听起来对我来说是一个合理的方法。但是,您也可以在MainViewController或应用程序委托上定义一个方法(即“-reloadUserDefaults”),当OptionsViewController完成时可以从中调用该方法。


进一步扩展,您还可以使用设置捆绑包,它会加载到NSUserDefaults中,并将您的首选项安装到iPhone本身的“设置”应用程序中。因此,用户首选项可在应用程序之外进行更改。这是Apple首选的方法。 - John Bellone
苹果公司并不一定希望您的偏好设置同时存在于两个地方。请参见http://tinyurl.com/cqyqja,“在您的应用程序中提供相同的偏好设置可能需要太多屏幕,并可能会使用户感到困惑。” - Shaggy Frog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接