Apple的资源编程指南(RPG)指出“最好在多个nib文件之间分发组件。”......
因此, 我有一个关联窗口笔尖(Nib 2),它有一个nsobjectcontroller,需要链接(选择self)到主文档窗口nib(Nib 1)中的nsarraycontroller。
我需要共享一个公共实例(nib 1中的nsarraycontroller或nib2中的nsobjectcontroller)。我可以在Nib 1中添加自定义对象,并将文件所有者设置为该类型的自定义对象。但是,每个nib都会实例化自己的实例。
是否有一种方法可以设置实例化对象的nib,或者声明外部引用。
我还“使文件的所有者成为nib文件之外的任何单一联系人”(RPG)。这是一个NSWindowController。
提前致谢。
答案 0 :(得分:0)
您可能希望让NIB1的所有者负责实例化NIB2。这将使它成为两个NIB的所有者。在通常的情况下,它可能看起来像这样:
// In the interface...
@property (nonatomic, readwrite, retain) NSArray* nib2TopLevelObjects;
// In the implementation...
- (void)awakeFromNib
{
NSNib* nib2 = [[[NSNib alloc] initWithNibNamed: @"NIB2" bundle: [NSBundle mainBundle]] autorelease];
NSArray* tlo = nil;
[nib2 instantiateWithOwner: self topLevelObjects: &tlo];
self.nib2TopLevelObjects = [tlo retain];
// Do other stuff...
}
- (void)dealloc
{
[_nib2TopLevelObjects release];
[super dealloc];
}
最后,NIB2将以NIB1的所有者为其所有者进行实例化,NIB2将其对象插入共享所有者(请确保不要将内容插入两个NIB的同一插座。)
所有这一切,我不确定这是否是在这里使用的正确模式。如果这些窗口都是同一文档的视图,您应该为每个窗口创建一个NSWindowController子类,并覆盖-[NSDocument makeWindowControllers]
来实例化它们。 (NSWindowController将成为每个NIB的“文件所有者”。)将文档NIB的所有者作为NSDocument子类是简单情况的“捷径”。一旦您需要多个窗口,NSWindowControllers就是您的选择。
每个NSWindowController都可以通过-document
返回到文档,NSDocument子类可以协调不同的NSWindowControllers之间的状态。这是一种更清洁的方法,避免所有带有破坏的IBOutlets等的恶作剧。
对于您的具体情况,我可以看到在sharedArrayController
期间在NSDocument子类上有一个来自NIB1的NSArrayController的-makeWindowControllers
属性,并重新发布它。然后,您可以通过绑定到文件的所有者>从NIB2访问它。 document.sharedArrayController.selection
。