単純な答えは、モデルデータ(ファイル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デベロッパーでなければ、デリゲート/データソースパターンを最初に使用することをお勧めします。
ありがとうございます。私はあなたのアイデアをここに再現しようとしていますが、明らかに何か不足しています。私を助けるチュートリアルを知っていますか?ありがとう! – Apollo
問題は、あなたの例が再帰的に見えるということです。私たちは、プロトコルに準拠する必要があるクラスからのパラメータを持つメソッドを持つプロトコルを持っています。そうですか? – Apollo
よく知っているだろう 'NSTableView'を見てください。上記のメソッドの設計は 'NSTableView'が' NSTableViewDataSource'プロトコルを実装する方法に基づいています。データをテーブルビューに保存することは決してありません。常にデータソースを使用するか、またはCocoaバインディングとNSArrayControllerを使用してデータにアクセスします。 –