模型 - 视图 - 控制器的好例子

时间:2010-11-30 21:32:23

标签: iphone

我是Objective-C和iPhone的新手,并且认为我已经掌握了它,直到许多播放应用程序之后,我遇到了围绕MVC,NIB和IB的一个非常基本的问题。是否有任何非常清楚的解释如何遵循这个框架的例子,我可以回去?

@interface test1ViewController : UIViewController {

    IBOutlet myView *myview;
    IBOutlet myModel *mymodel;
}

视图和模型都由IBOutlets链接,但实例化模型对象要么杀死应用程序,要么生成一个不响应任何消息的对象。

我也不清楚在哪里进行最佳的初始化。我目前在视图控制器中通过viewDidLoad执行此操作。有没有标准的方法来做到这一点,模拟器实际上总是以相同的方式启动?应该使用awakeFromNib吗?如果我使用普通代码或IB,它会有什么不同吗?如果我使用IB,它是否应该包含模型对象?

MVC的想法在这里对我来说很有意义,因为我可能有几个视图和视图控制器都反馈 - 并共享 - 一个共同的中央数据模型。任何有关这个新手问题的参考或进展都非常受欢迎!

3 个答案:

答案 0 :(得分:1)

我不会花太多时间来担心MVC的“经典”定义。 iOS遵循它,但有很多令人困惑的术语。 (“查看控制器”)

你说尝试使用模型会杀死你的应用。你保留myModel吗?您必须保留所有IBOutlets。

笔尖是“冻干”物品的集合。当您加载笔尖时,其中的对象将被“重新水合”,如果您愿意的话。这意味着它们会恢复生机,所有属性都设置为冻结它们时的任何属性。所以你谈到“实例化”和“初始化”,但这不适用于IB。对象是ALREADY实例化和初始化。想象一下,编写笔尖“暂停”对象。当您加载笔尖时,对象会在冻结时恢复正在执行的操作。他们将获得一个awakeFromNib消息,因此这是一个放置一些代码来检查应用程序状态的好地方,看看你是否必须对你的对象进行操作以使其加快速度。

viewDidLoad看起来像是一个“初始化”方法,但不要被愚弄。它是视图控制器生命周期的一部分,可以不止一次调用它! (如果您的控制器视图被清除为低内存警告的一部分,则视图必须再次调用viewDidLoad ...等待它...重新加载。)因此,将视图设置内容放在viewDidLoad中是合适的,但不是其他初始化类型的东西。

对于“常见数据”的事情,我喜欢创建一个单例数据模型类。您的各种视图可以在模型上设置属性,或发送通知。您还可以使用KVO(键值观察)来监视模型中的更改。

答案 1 :(得分:0)

IB使功能不可见。我不喜欢它,我不再使用IB,更喜欢在代码中包含所有内容。然后,当您查看代码时,您会看到正在发生的事情 - 所有导航控制器,所有格式化程序等 - 而无需切换到IB。也许Xcode4会使集成IB更好,但我可能不会回去。很多人都喜欢IB,所以尝试两种方法,看看你最喜欢什么。

IBOutlet / IBAction实际上对编译器没有任何意义,但是它们让IB识别它可以向xib中的元素发送消息或将其写入xib中的元素的ivars。你在这里使用它有点简单,除非你确实有一个只与xib通信的模型。您通常拥有的是xib中与视图对象链接的一系列控件,该视图直接与控制器通信。控制器与模型通信。非常宽松地说,模型是数据和逻辑的内部表示,视图就是你看到的,控制器是它们之间的粘合剂。

MVC线可能很模糊,你只需要对它感到满意。如果您的滑块控件的值代表模型中的某个值,则很难将其视为界面的一部分,尤其是当您持久保存该值并将其用作模型的中心部分时。我喜欢斯坦福iPhone类的介绍。他们不会花费大量时间在上面,因为它可能很难完全遵循,并且有些情况并不是最好的。

Notes from that class - 您可以在iTunes上找到要跟进的视频。

您对viewDidLoad的使用是正确的,您可以在视图及其对象上执行初始化。如果使用IB,你可能没什么可做的,因为你可以在xib中设置大多数属性。如果不使用IB,你会使用它更多。

答案 2 :(得分:0)

很多时候,类似你的模型的东西会在运行时由应用程序委托或视图控制器本身连接。

IB通常更多地用于将视图和控制器链接在一起,应用程序处理模型。

也就是说,您应该能够让IB创建模型的实例并将其分配到IBOutlet中。只是在没有调用经典的init方法的情况下创建你的模型是否正常?它是否正确实施了NSCoding?