我有一个非常简单的应用程序测试,我想在NSImageView对象中拖放文件。
我已经可以从此操作中获取文件列表,但现在我想将这些数据存储在一个数组中,以便在View中使用数据绑定进行访问。我唯一能够使用数据绑定工作的代码很难,在AppDelegate中有一个我使用数组控制器访问的数组。但是,我的数据在我为NSImageView创建的一个类中,名为" DropView",它扩展了" NSImageView" class并处理drop动作。
如何传递数组信息以使绑定成为可能?
欢迎任何建议。谢谢!
答案 0 :(得分:1)
我决定在更大的项目中使用单身人士。在这个较小的一个我喜欢这个:
1 - 将AppDelegate引用添加到子类(m文件):
#import "AppDelegate.h"
2 - 调用AppDelegate中声明的方法,传递所需的所有信息,如下所示:
[[NSApp delegate] doSomething:someInformation];
3 - 设置所用方法中的所有信息。
4 - 在界面中进行绑定。
答案 1 :(得分:0)
简单的答案是您不应该在视图中存储模型数据(文件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
然后,在接收drop的view方法中,你会做类似的事情:
- (void)receivedDroppedURLs:(NSArray*)urls
{
if([datasource conformsToProtocol:@protocol(YourViewProtocol)])
{
[datasource imageView:self receivedDroppedURLs:urls];
}
}
另一种方法是通过自定义绑定。在自定义视图中实现绑定有点复杂,如果您不是经验丰富的Cocoa开发人员,我建议您最初使用委托/数据源模式。