可可拖;丢弃信息

时间:2012-03-12 15:28:36

标签: macos cocoa data-binding drag-and-drop

我有一个非常简单的应用程序测试,我想在NSImageView对象中拖放文件。

我已经可以从此操作中获取文件列表,但现在我想将这些数据存储在一个数组中,以便在View中使用数据绑定进行访问。我唯一能够使用数据绑定工作的代码很难,在AppDelegate中有一个我使用数组控制器访问的数组。但是,我的数据在我为NSImageView创建的一个类中,名为" DropView",它扩展了" NSImageView" class并处理drop动作。

如何传递数组信息以使绑定成为可能?

欢迎任何建议。谢谢!

2 个答案:

答案 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开发人员,我建议您最初使用委托/数据源模式。