Objective c 接口的可重用位,用IB设计

Objective c 接口的可重用位,用IB设计,objective-c,cocoa,interface-builder,nsview,nib,Objective C,Cocoa,Interface Builder,Nsview,Nib,我正在制作一个应用程序,在许多不同的上下文中包含相同的按钮组。按钮将其操作发送到每个上下文中的不同对象。我希望能够在IB中设计一个包含按钮的单一NSView,然后能够将该视图的副本放在NIB中的许多地方,同时保持链接,从而传播更改。我希望将每个实例连接到不同的对象,并让按钮将其操作发送到其父视图连接到的任何对象 我曾想过创建NSView的一个子类,当加载时,它会用另一个从nib文件加载的视图替换自己,将连接的对象设置为文件的所有者,但我不相信这是最干净的方法。下面是我对这个想法的实现(它确实有效

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

我曾想过创建NSView的一个子类,当加载时,它会用另一个从nib文件加载的视图替换自己,将连接的对象设置为文件的所有者,但我不相信这是最干净的方法。下面是我对这个想法的实现(它确实有效):


这是最干净的方法吗?是否有一种标准的方法来执行此操作?

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

如果需要,则需要生成NSView的子类

我曾想过创建NSView的一个子类,当加载时,它会用另一个从nib文件加载的视图替换自己,将连接的对象设置为文件的所有者,但我不相信这是最干净的方法

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


另一种方法是从nib加载按钮,但在将其添加为子视图之前,必须调整其帧。

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

如果需要,则需要生成NSView的子类

我曾想过创建NSView的一个子类,当加载时,它会用另一个从nib文件加载的视图替换自己,将连接的对象设置为文件的所有者,但我不相信这是最干净的方法

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


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

令人讨厌的是,它没有保留链接(但想想它会如何)。但这只是一个很棒的提示!谢谢你,彼得!令人讨厌的是,它没有保持链接(但想想它会如何)。但这只是一个很棒的提示!谢谢你,彼得!
@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