NSWIndowController创建Outlet序列的nib加载

时间:2013-06-08 01:18:25

标签: objective-c cocoa iboutlet nswindowcontroller

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

子类的NSWindowController看起来没问题,但是nib加载后NIRbjectControllers,NSArrayControllers和nib中的'自定义'NSObject都被设置为0x0。

所有控制器和对象都在IB中正确“绑定”。 NSObject子包含initWithCoder。是否有进一步的要求或清醒。我不应该认为所有的内容基本上什么都不做,但是return super。那是因为所有引用的对象都在nib中设置(绑定)。

它似乎与nib加载序列有关。并且,我被认为IBOutlets在awakeFromNib之前可用,跟随[super initWithWindowNibName:name];

基于文档,

  

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

此外,

  

如果需要在加载时进一步配置nib文件中的对象   在你的笔尖加载之后,最合适的时间是   呼叫返回。此时,所有对象都被创建,   初始化并准备好使用。

我错误地认为self = [super initWithWindowNibName:name]是我的 nib-loading 来电?

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

1 个答案:

答案 0 :(得分:2)

  

相信self = [super initWithWindowNibName:name]我错了   是我的笔尖加载电话?

-[NSWindowController loadWindow]是实际加载笔尖的方法。不是说你应该直接打电话; -[NSWindowController window]是您应该拨打的,因为后者也会调用-[NSWindowController windowWillLoad]-[NSWindowController windowDidLoad]

NSWindowController州的文档:

  

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

这样做的结果是,nib中的 nothing 将被加载,直到其中的窗口被加载。

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