2012-03-12 5 views
1

私はNSImageViewオブジェクトにファイルをドラッグアンドドロップする非常に簡単なアプリケーションテストを行っています。Cocoaのドラッグアンドドロップ情報

私はすでにこのアクションからファイルのリストを取得できますが、データバインディングを使用してビューにアクセスするために、このデータを配列に格納します。データバインディングでうまく動作する唯一のコードは、難しいですが、配列コントローラを使用してアクセスする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 

次に、コントローラオブジェクトをビューのデータソースとして設定します。これを行うために他の方法

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

:ドロップを受けビュー方式では、あなたのような何かをしたい、そして、

@interface YourController <YourViewProtocol> 
- (void)imageView:(YourImageViewClass*)aView receivedDroppedURLs:(NSArray*)arrayOfURLs; 
@end 

:コントローラは、プロトコルに準拠し、そのメソッドを実装する必要がありますカスタムバインディングによるものです。カスタムビューでのバインディングの実装はもう少し複雑で、経験豊富なCocoaデベロッパーでなければ、デリゲート/データソースパターンを最初に使用することをお勧めします。

+0

ありがとうございます。私はあなたのアイデアをここに再現しようとしていますが、明らかに何か不足しています。私を助けるチュートリアルを知っていますか?ありがとう! – Apollo

+0

問題は、あなたの例が再帰的に見えるということです。私たちは、プロトコルに準拠する必要があるクラスからのパラメータを持つメソッドを持つプロトコルを持っています。そうですか? – Apollo

+0

よく知っているだろう 'NSTableView'を見てください。上記のメソッドの設計は 'NSTableView'が' NSTableViewDataSource'プロトコルを実装する方法に基づいています。データをテーブルビューに保存することは決してありません。常にデータソースを使用するか、またはCocoaバインディングとNSArrayControllerを使用してデータにアクセスします。 –