代码之家  ›  专栏  ›  技术社区  ›  andyvn22

接口的可重用位,在ib中设计

  •  1
  • andyvn22  · 技术社区  · 14 年前

    我正在制作一个应用程序,在许多不同的上下文中包含相同的按钮组。按钮将其操作发送到每个上下文中的不同对象。我希望能够在ib中设计一个包含按钮的nsview,然后能够将该视图的副本放在我的nibs中的许多地方,同时保持链接,因此更改会传播。我想将这些实例中的每一个连接到不同的对象,并让按钮将它们的操作发送到它们的父视图所连接的任何对象。

    我想创建nsview的一个子类,当加载时,它用另一个从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
    

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Peter Hosey    14 年前

    您可以在ib中创建包含按钮的视图,然后将该视图拖到库窗口中并保存它。关键是,它们之间没有链接;编辑一个链接不会改变其他链接。

    如果您希望这样做,您将需要改为生成nsview的子类。

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

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

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