简单的答案是,您不应该将模型数据(文件URL数组)存储在视图中。
您的视图应该将文件列表传递给其他控制器对象,然后该控制器对象将文件列表存储在某种模型对象中。这是MVC的意义。要做到这一点
一种方法是使用代理模式,你的观点将宣布协议的方法是这样的:
@protocol YourViewProtocol
- (void)imageView:(YourImageViewClass*)aView receivedDroppedURLs:(NSArray*)arrayOfURLs;
@end
您的观点也有微弱的datasource
属性:
@interface YourImageViewClass : NSImageView
@property (weak) id <YourViewProtocol> datasource;
@end
然后,您可以将您的控制器对象设置为视图的数据源。控制器必须符合协议并执行其方法:
@interface YourController <YourViewProtocol>
- (void)imageView:(YourImageViewClass*)aView receivedDroppedURLs:(NSArray*)arrayOfURLs;
@end
然后,在接收下降的观点方法,你会做这样的事情:
- (void)receivedDroppedURLs:(NSArray*)urls
{
if([datasource conformsToProtocol:@protocol(YourViewProtocol)])
{
[datasource imageView:self receivedDroppedURLs:urls];
}
}
另一种方式来做到这一点是通过自定义绑定。在自定义视图中实现绑定有点复杂,如果您不是经验丰富的Cocoa开发人员,我建议您最初使用委托/数据源模式。
感谢罗布..我想在这里复制你的想法,但我显然失去了一些东西。你知道任何教程可以帮助我吗?谢谢! – Apollo 2012-03-15 21:54:10
问题是你的例子看起来很像递归..我们有一个带有一个方法的协议,它的参数来自需要符合协议的类。是对的吗? – Apollo 2012-03-15 22:15:10
看看你可能熟悉的'NSTableView'。上述方法的设计是基于'NSTableView'实现其'NSTableViewDataSource'协议的方式。您绝不会将数据存储在表视图中,它始终通过使用数据源或使用Cocoa绑定和“NSArrayController”进行访问。 – 2012-03-15 22:23:03