2012-03-12 66 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