使用NSTreeView查看交换

时间:2012-07-31 20:59:32

标签: cocoa nsview nsarraycontroller

我已经制作了一个自定义的NSView。基本上,对于我选择的树视图中的每个项目,我想将视图与另一个视图交换。

我的问题是,我应该使用像NSArrayController这样的东西吗?如果是这样,你如何根据NSTreeView中的选择连接自定义NSView以使用NSArrayController 在视图之间交换?

1 个答案:

答案 0 :(得分:2)

您可以使用NSArrayController来执行此操作,但是您需要考虑以下几点:

每个NSView都应该由NSViewController控制,因此您最好在NSArrayController中存储一些标识符,从中可以扣除控制器类和关联的NIB。获得NSViewController类名后,可以实例化它并使用initWithNibName:方法加载附带的视图。

引入“电流控制器”的概念可能是个好主意。这样,您随时只能在内存中拥有一个控制器(具有关联的视图和模型对象图)。根据树视图中的选择交换控制器后,旧控制器及其所有关联对象将从内存中释放。

示例:

  • 存储在NSArrayController@"Customers"
  • 控制器类:@"CustomersViewController"
  • 相关NIB:@"CustomersView"

通过在您的阵列中存储@"Customers",您可以扣除正确的控制器类名称和相关的NIB:

NSString *aControllerName = [anIdentifier stringByAppendingString: @"ViewController"];
NSString *aNibName = [anIdentifier stringByAppendingString: @"View"];   
Class aControllerClass = NSClassFromString(aControllerName);
[self setCurrentController: [[aControllerClass alloc] initWithNibName: aNibName bundle: [NSBundle mainBundle]]];

在上面的代码中anIdentifier会保留值@"Customers",并且可能来自您的NSArrayController。上例中的self指的是您的顶级控制器(其类别取决于您的设计)。

视图的实际交换可以按如下方式进行:

[[self currentController] view] removeFromSuperView];
... do swapping ...
[[self view] addSubview:[[self currentController] view]];

如果您使用填充树视图的数据源存储标识符,则可能不需要单独的NSArrayController,因为您可以直接从树视图中选择所选对象的标识符。