可重复使用的接口,在IB中设计

时间:2010-02-23 02:40:38

标签: objective-c cocoa interface-builder nsview nib

我正在制作一个应用程序,其中包含许多不同上下文中的同一组按钮。按钮将其操作发送到每个上下文中的不同对象。我希望能够在IB中设计包含按钮的单个NSView,然后能够将该视图的副本放在我的笔尖中的许多位置,同时保持链接,以便更改传播。我想将每个实例连接到不同的对象,并让按钮将其动作发送到父视图所连接的任何对象。

我想创建一个NSView的子类,当它被加载时,它将自己替换为从nib文件加载的另一个视图,将连接对象设置为File的Owner,但我不相信这是最干净的方法。这是我对这个想法的实现(-does- work):

@implementation AVNViewFromNib

- (void)awakeFromNib
{
    //Load the nib whose name is specified by the "nibFile" key
    NSNib* viewNib = [[NSNib alloc] initWithNibNamed:[self valueForKey:@"nibFile"] bundle:[NSBundle mainBundle]];
    NSMutableArray* topLevelObjects = [NSMutableArray new];
    [viewNib instantiateNibWithOwner:relatedObject topLevelObjects:&topLevelObjects];

    //Find our replacement view in that nib
    for (id currentObject in topLevelObjects)
    {
        if ([currentObject isKindOfClass:NSClassFromString(@"AVNReplacementView")])
        {
            representedView = currentObject;
            break;
        }
    }

    //Copy appropriate properties from us to our representedView
    [representedView setAutoresizingMask:[self autoresizingMask]];
    [representedView setFrame:[self frame]];
    [[self superview] addSubview:representedView];

    //We were never here. :)
    [self removeFromSuperview];
    [viewNib autorelease];
}

@end

@implementation AVNReplacementView
@end

这是最干净的方法吗?有没有一种标准的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用IB中的按钮创建视图,然后将该视图拖到“库”窗口中并保存。问题是,它们之间没有“联系”;编辑一个不会改变其他人的任何内容。

如果你想要,你需要改为创建NSView的子类。

  

我想创建一个NSView的子类,当它被加载时,它将自己替换为从nib文件加载的另一个视图,将连接的对象设置为File的Owner,但我不相信这是最干净的方法。 / p>

这可行。我不认为那真是那么脏; init方法返回对象的原因是它们显式地可以返回不同的对象。但是,我不确定你如何处理不同帧的视图,因为加载的视图将具有它在nib中的任何帧。

另一种方法是从笔尖加载按钮,但在将它们添加为子视图之前,您必须调整它们的帧。