nsobject控制器链接两个nib(xib)文件。声明nib实例化

时间:2013-06-01 20:38:07

标签: cocoa core-data interface-builder nib cocoa-bindings

Apple的资源编程指南(RPG)指出“最好在多个nib文件之间分发组件。”......

因此, 我有一个关联窗口笔尖(Nib 2),它有一个nsobjectcontroller,需要链接(选择self)到主文档窗口nib(Nib 1)中的nsarraycontroller。

我需要共享一个公共实例(nib 1中的nsarraycontroller或nib2中的nsobjectcontroller)。我可以在Nib 1中添加自定义对象,并将文件所有者设置为该类型的自定义对象。但是,每个nib都会实例化自己的实例。

是否有一种方法可以设置实例化对象的nib,或者声明外部引用。

我还“使文件的所有者成为nib文件之外的任何单一联系人”(RPG)。这是一个NSWindowController。

提前致谢。

1 个答案:

答案 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