Cocoa中的NSViews数组是什么?

3

我是一名开发Mac应用程序的工程师。其中一个窗口可以加载同一个NIB/XIB文件中的多个NSView对象。

但我的代码看起来像这样:

@interface TheWindowController : NSWindowController {
    //Interface objects
    IBOutlet NSTableView    *detailsTree;
    IBOutlet NSView         *bigView;
    IBOutlet NSView         *subView1;
    IBOutlet NSView         *subView2;
    IBOutlet NSView         *subView3;
    IBOutlet NSView         *subView4;
    IBOutlet NSView         *subView5;
}

我的问题是是否可以将所有这些IBOutlets保存在数组、字典或类似的东西中。这样,将来在我的实现中,我就可以像这样做:

- (IBAction)traceTableViewClick:(id)sender {
    //having now a NSArray called subviewsArray
    [[[bigView subviews] objectAtIndex:0] removeFromSuperview];
    [rightView addSubview: [subviewsArray objectAtIndex:[detailsTree selectedRow]]];
}

这是可能的吗?如何实现?有没有示例?


2
IBOutletCollection 可用吗(我只使用 iOS,所以不确定)? IBOutletCollection(NSView) NSArray *views;。然后在界面构建器中将它们连接到集合而不是单个输出。 - Paul.s
IBOutletCollection 在 Cocoa 的界面构建器中似乎无法工作,它不会显示在链接部分。但在 iOS 中非常有用。 - Can
2个回答

0
只需像添加其他对象一样,将您的NSViews添加到NS(Mutable)Array或NS(Mutable)Dictionary中即可。

0

我曾经使用自定义视图完成了类似的操作,其中包含许多控件,我希望能够批量操作它们。你需要在 @interface 声明中将它们分开,以便 IBOutlet属性 能够与 Interface Builder 正确地配合使用,但是在你的 init 方法中,你可以自己将它们组织成一个数组或 NSArray

- (id)init
{
    self = [super init];
    if (self != nil)
    {
        _viewArray = [[NSArray alloc] initWithObjects:subView1, subView2,
                        subView3, subView4, subView5, nil];
    }
    return self;
}

- (void)dealloc
{
    [_viewArray release];
    ...etc...
    [super dealloc];
}

然后您可以按照您的意愿对它们进行操作:

- (void)doThing
{
    for (id view in _viewArray)
    {
        [view doSomething];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接