您可能想让 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
。