【问题标题】:Cocoa drag & drop information可可拖放信息
【发布时间】:2012-03-12 15:28:36
【问题描述】:

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

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

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

欢迎提出任何建议。谢谢!

【问题讨论】:

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


    【解决方案1】:

    我决定在一个更大的项目中使用单例。在这个较小的,我是这样做的:

    1 - 将 AppDelegate 引用添加到子类(m 文件):

    #import "AppDelegate.h"

    2 - 调用 AppDelegate 中声明的方法,传递所需的所有信息,如下所示:

    [[NSApp delegate] doSomething:someInformation];

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

    4 - 在界面中进行绑定。

    【讨论】:

      【解决方案2】:

      简单的答案是您不应该将模型数据(文件 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 开发人员,我建议您最初使用委托/数据源模式。

      【讨论】:

      • 谢谢 Rob.. 我想在这里复制你的想法,但我显然遗漏了一些东西。你知道任何可以帮助我的教程吗?谢谢!
      • 问题是你的例子看起来有点递归。我们有一个协议,它的参数来自需要符合协议的类。对吗?
      • 看看你可能熟悉的NSTableView。上述方法的设计基于NSTableView 实现其NSTableViewDataSource 协议的方式。您永远不会将数据存储在表视图中,它总是通过使用数据源或使用 Cocoa 绑定和 NSArrayController 来访问。
      • my answer to this question中也有一些类似的更完整的代码,可能会有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多