0

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

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

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

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

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

提前致谢。

4

1 回答 1

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 都可以通过 NSDocument 子类返回文档,-document并且可以协调不同 NSWindowController 之间的状态。这是一种更清洁的方法,并且避免了所有带有破坏 IBOutlets 等的恶作剧。

对于您的具体情况,我可以看到sharedArrayController在 NSDocument 子类上有一个属性,该属性在 NSDocument 期间从 NIB1 获取 NSArrayController-makeWindowControllers并重新出售它。然后,您可以通过绑定到 File's Owner > 从 NIB2 访问它document.sharedArrayController.selection

于 2013-06-11T12:20:27.407 回答