2012-03-12 67 views
1

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

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

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

任何建议是值得欢迎的。谢谢!

回答

1

我决定在一个更大的项目中使用单例。在这个较小的一个我不喜欢这样的:

1 - 添加的AppDelegate参考子类(M档):

#import "AppDelegate.h"

2 - 呼叫在AppDelegate中声明的方法传递需要像所有信息这样的:

[[NSApp delegate] doSomething:someInformation];

3 - 设置中使用的方法的所有信息。

4 - 在界面中进行绑定。

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 

然后,在接收下降的观点方法,你会做这样的事情:

- (void)receivedDroppedURLs:(NSArray*)urls 
{ 
    if([datasource conformsToProtocol:@protocol(YourViewProtocol)]) 
    { 
     [datasource imageView:self receivedDroppedURLs:urls]; 
    } 
} 

另一种方式来做到这一点是通过自定义绑定。在自定义视图中实现绑定有点复杂,如果您不是经验丰富的Cocoa开发人员,我建议您最初使用委托/数据源模式。

+0

感谢罗布..我想在这里复制你的想法,但我显然失去了一些东西。你知道任何教程可以帮助我吗?谢谢! – Apollo 2012-03-15 21:54:10

+0

问题是你的例子看起来很像递归..我们有一个带有一个方法的协议,它的参数来自需要符合协议的类。是对的吗? – Apollo 2012-03-15 22:15:10

+0

看看你可能熟悉的'NSTableView'。上述方法的设计是基于'NSTableView'实现其'NSTableViewDataSource'协议的方式。您绝不会将数据存储在表视图中,它始终通过使用数据源或使用Cocoa绑定和“NSArrayController”进行访问。 – 2012-03-15 22:23:03