我正在制作一个应用程序,其中包含许多不同上下文中的同一组按钮。按钮将其操作发送到每个上下文中的不同对象。我希望能够在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
这是最干净的方法吗?有没有一种标准的方法来解决这个问题?
答案 0 :(得分:1)
您可以使用IB中的按钮创建视图,然后将该视图拖到“库”窗口中并保存。问题是,它们之间没有“联系”;编辑一个不会改变其他人的任何内容。
如果你想要,你需要改为创建NSView的子类。
我想创建一个NSView的子类,当它被加载时,它将自己替换为从nib文件加载的另一个视图,将连接的对象设置为File的Owner,但我不相信这是最干净的方法。 / p>
这可行。我不认为那真是那么脏; init
方法返回对象的原因是它们显式地可以返回不同的对象。但是,我不确定你如何处理不同帧的视图,因为加载的视图将具有它在nib中的任何帧。
另一种方法是从笔尖加载按钮,但在将它们添加为子视图之前,您必须调整它们的帧。