1

我有一个我自己编的自定义 NSView。基本上,对于我选择的树视图中的每个项目,我都想将视图与另一个项目交换。

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

4

1 回答 1

2

您可以使用 anNSArrayController来执行此操作,但是您必须考虑以下几点:

每个都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的标识符,因为您可以直接从树视图中的选定对象中获取标识符。

于 2012-08-01T00:18:19.010 回答