我有一个我自己编的自定义 NSView。基本上,对于我选择的树视图中的每个项目,我都想将视图与另一个项目交换。
我的问题是,我应该为此使用 NSArrayController 之类的东西吗?如果是这样,您如何连接自定义 NSView 以使用 NSArrayController并根据 NSTreeView 中的选择在视图之间交换?
我有一个我自己编的自定义 NSView。基本上,对于我选择的树视图中的每个项目,我都想将视图与另一个项目交换。
我的问题是,我应该为此使用 NSArrayController 之类的东西吗?如果是这样,您如何连接自定义 NSView 以使用 NSArrayController并根据 NSTreeView 中的选择在视图之间交换?
您可以使用 anNSArrayController
来执行此操作,但是您必须考虑以下几点:
每个都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
的标识符,因为您可以直接从树视图中的选定对象中获取标识符。