1

我在使用包含 NSWindowController(作为文件所有者)以及绑定到 nib 中的文件所有者的 ArrayController 的 nib 时遇到了大麻烦。

子类化的 NSWindowController 似乎没问题,但是 nib 中的 NSObjectControllers、NSArrayControllers 和“自定义”NSObjects 都设置为 0x0——在 nib 加载之后。

所有控制器和对象都在 IB 中正确“绑定”。NSObject 子类有一个initWithCoder. 是否对 inits 或 awake 有进一步要求。我不应该说所有的 inits 基本上什么都不做,但是return super. 那是因为所有引用的对象都在笔尖内设置(绑定)。

它似乎与笔尖加载的顺序有关。而且,我被引导相信 IBOutlets 在 awakeFromNib 之前可用,遵循 [super initWithWindowNibName:name];

根据文档,

在 Mac OS X v10.5 及更高版本中,设置插座还会为任何注册的观察者生成键值观察 (KVO) 通知。这些通知可能在重新建立所有对象间连接之前发生,并且肯定在调用对象的任何awakeFromNib方法之前发生。

而且,

如果您需要在加载时进一步配置 nib 文件中的对象,最合适的时间是在您的 nib-loading 调用返回之后。此时,所有对象都已创建、初始化并可供使用。

我错误地相信 self = [super initWithWindowNibName:name] 是我的笔尖加载调用吗?

我的一些 awakeFromNib 仅在显示窗口时才被调用。IE。[myWindowController showWindow: nil];我的窗口作为正在阻塞调用的工作表打开,因此在 showWindow 之后访问这些数组控制器并不容易。

4

1 回答 1

2

我错误地相信 self = [super initWithWindowNibName:name] 是我的笔尖加载调用吗?

-[NSWindowController loadWindow]是实际加载笔尖的方法。并不是说您应该直接调用它;-[NSWindowController window]是你应该调用的那个,因为后者也调用-[NSWindowController windowWillLoad]and -[NSWindowController windowDidLoad]

状态的文档NSWindowController

尽管窗口控制器可以管理以编程方式创建的窗口,但它通常管理 nib 文件中的窗口。nib 文件可以包含其他顶级对象,包括其他窗口,但窗口控制器的职责是这个主窗口。

这样做的结果是,在加载其中的窗口之前,笔尖中的任何内容都不会被加载。

这是一个曾经让我好几次的“陷阱”!

于 2013-06-08T03:12:19.597 回答