覆盖Interface Builder实例化对象?

时间:2009-05-21 12:26:05

标签: objective-c cocoa cocoa-touch xcode model-view-controller

我正在为iPhone开发,我有一个类DataManager,用于维护我的应用程序数据。当应用程序启动/退出时,使用NSKeyedArchiver(和Unarchiver)类从磁盘读取/写入数据以创建此类的实例,因为DataManager遵循NSCoding协议。

我遇到的一个问题是我需要DataManager可以被我的许多其他IB类访问,因此它被定义为IB中的对象,并且这些类有一个插座。 DataManager是使用标准的init:方法(或者可能是initWithCoder:?)创建的,但由于IB没有正确的文件(或文件中的NSData)来实例化对象,因此它没有初始内容。

那么,有没有办法告诉IB 自动实例化该类?这将使用我的应用程序委托来执行,例如:

AppDelegate.h

IBOutlet DataContext *context;

AppDelegate.m

context = [NSKeyedUnarchiver unarchiveObjectWithData:dataLoadedFromFile];

如您所见,这是一个问题。上下文不是实例化两次,一次是InterfaceBuilder,第二次是我的应用程序委托?

我想阻止将上下文保持为委托中的ivar,因为这似乎偏离了MVC范例,而是倾向于单例模式。 (控制器不应该对我的数据负责。它可以显然保持对它的引用,但不应该负责将它提供给其他类。)

1 个答案:

答案 0 :(得分:1)

  

当应用程序启动/退出时,使用NSKeyedArchiver(和Unarchiver)类从磁盘读取/写入数据以创建此类的实例,因为DataManager遵循NSCoding协议。

     

我遇到的一个问题是我需要DataManager可以被我的许多其他IB类访问,所以它被定义为IB中的一个对象......正如你所看到的,这就产生了一个问题。上下文不是实例化两次,一次是InterfaceBuilder,第二次是我的应用程序委托?

烨。

首先,您应该考虑这是控制器还是模型对象。听起来我觉得它是一个控制器。

如果是,则应将模型移动到单独的一个或多个对象,并使这些符合NSCoding,并使数据管理器加载并保存这些对象。此解决方案的一个好处是,您可以告诉数据管理器保存对象并在收到低内存警告时清除它们,而不仅仅是在退出时。