1

仍在执行 cs193p 的作业 4。- http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/assignments/Assignment%204_2.pdf

我已经完全(ish)实现了从地点列表中显示照片。

我正在添加应用程序的第二个选项卡(必需的任务 10 和 11),用于生成并显示按时间顺序查看的 20 张最近照片的列表。

我的问题与 MVC 模式和设置/访问 NSUserdefaults 有关。

基本上,每当查看照片时,都需要更新存储在 NSUserdefaults 中的属性列表。

在选择“最近的照片”选项卡时,需要读取并显示这些值,以便用户可以选择最近查看的照片,然后通过选择它来查看。

我认为我可以通过编写代码行很容易地实现这一点,并且它可能会起作用。

我见过这个问题:CS193P UITabBarController MVC Help on Assignment 4这有点相关,但并没有真正解决我关于模式性质的更多理论问题。

我的问题更多关于 MVC 模式。

在讲座中,当他用最喜欢的图表演示这一点时,在之前的计算器作业中,他使用了一个委托在收藏夹列表视图控制器和 graphviewController 之间进行通信(参见第 9 课的幻灯片 64 上的图表)。 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/lectures/Lecture%209_1.pdf

我正在尝试确定是否需要做类似的事情以避免破坏 MVC 模式,或者我是否可以在 imageViewController 的 viewWillLoad 中使用 NSUserdefaults 将照片添加到收藏夹,然后在我的设置器中使用 RecentImagesViewController . 我知道 NSUserdefaults 是为持久性而设计的,只是感觉有点像我在使用全局变量。

我意识到如果您不熟悉 cs193p 课程,这个问题的措辞会让您难以理解——抱歉。

感谢您的任何建议!

4

3 回答 3

2

I don't think you have to transform something rather simple in something complex. You are storing the favorites using the NSUserDefaults and that's it. The place where you are using might not be the best (I am not saying the viewWillLoad is a bad place, I don't know your code), but I don't think you need a delegate to just update the NSUserDefaults. Botton line, don't forget the KISS principle. :)

于 2012-05-13T21:16:15.933 回答
0

好吧,您可能会觉得您使用的是全局变量,因为用户默认自己是一个全局概念。他们应该是。您不希望应用程序的不同部分在用户偏好的不同步版本上运行。

但是,如果您在旧的 C/C++ 全局静态数据块的意义上使用术语变量,那么,不……不是这样的。 NSUserDefaults由 Apple 编写,是一个很好的整洁,封装了用户默认数据。您用来访问类似单例实例的事实[NSUserDefaults standardUserDefaults](不确定 Apple 是否选择实现它)并不意味着它是一个真正的全局变量。

我同意 Jacky Boy 的观点,即保持简单是最好的,但你的问题实际上是在问你这样做是否违反了 MVC 模式(并且盲目地坚持模式并不总是会让你的代码成为最好的) . 这取决于您认为该模型是什么。我可以证明 Apple 构建NSUserDefaults为偏好数据的模型层封装。所以,你有你的模型层,你的控制器应该能够使用它。

或者您是否觉得需要自己编写整个模型层,在这种情况下,您的模型层将只包含NSUserDefaults. 在大多数情况下,这似乎有点矫枉过正。

这可能是一种可以保证的情况。如果您有很多看起来在逻辑上相关的偏好数据,但其中一些不适合NSUserDefaults. 也许它是很多二进制数据,存储在对象的层次结构中,你想用 Core Data 持久化它。但是,它似乎仍然与您保留的内容在逻辑上相关NSUserDefaults。也许那时,您决定编写自己的模型层,它封装了核心数据和NSUserDefaults数据。然后您的视图控制器可以直接使用它。

但是,总的来说,我认为 iOS 设计得很好,任何人都可以直接使用该standardUserDefaults对象。

于 2012-05-14T08:55:59.807 回答
0

如果我正确理解了这个问题,听起来应该从适当的视图控制器进行设置/加载。创建可以从每个不同选项卡的视图控制器调用的委托(可能是也可能不是单例)将有助于防止您重复代码。

于 2012-05-13T21:27:22.137 回答