我已经制作了一个自定义的NSView。基本上,对于我选择的树视图中的每个项目,我想将视图与另一个视图交换。
我的问题是,我应该使用像NSArrayController这样的东西吗?如果是这样,你如何根据NSTreeView中的选择连接自定义NSView以使用NSArrayController 和在视图之间交换?
答案 0 :(得分:2)
您可以使用NSArrayController
来执行此操作,但是您需要考虑以下几点:
每个NSView
都应该由NSViewController
控制,因此您最好在NSArrayController
中存储一些标识符,从中可以扣除控制器类和关联的NIB。获得NSViewController
类名后,可以实例化它并使用initWithNibName:
方法加载附带的视图。
引入“电流控制器”的概念可能是个好主意。这样,您随时只能在内存中拥有一个控制器(具有关联的视图和模型对象图)。根据树视图中的选择交换控制器后,旧控制器及其所有关联对象将从内存中释放。
示例:
NSArrayController
:@"Customers"
@"CustomersViewController"
@"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
,因为您可以直接从树视图中选择所选对象的标识符。