我在使用包含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之后访问这些数组控制器并不容易。
答案 0 :(得分:2)
相信self = [super initWithWindowNibName:name]我错了 是我的笔尖加载电话?
-[NSWindowController loadWindow]
是实际加载笔尖的方法。不是说你应该直接打电话; -[NSWindowController window]
是您应该拨打的,因为后者也会调用-[NSWindowController windowWillLoad]
和-[NSWindowController windowDidLoad]
。
NSWindowController
州的文档:
虽然窗口控制器可以管理以编程方式创建 窗口,它通常管理一个nib文件中的窗口。 nib文件可以 包含其他顶级对象,包括其他窗口,但是 窗口控制器的责任是这个主窗口。
这样做的结果是,nib中的 nothing 将被加载,直到其中的窗口被加载。
这是一个曾经让我好几次的“陷阱”!