某些應用程序(如Photoshop)允許用戶從Web瀏覽器拖動圖片,或者將文件從文件系統中拖出到應用程序的停靠欄圖標上。這樣做會打開該應用程序中的文件。當文件,圖片等放在其停靠欄圖標上時,如何使OS X應用程序反應?
這是如何完成的?我想使用Cocoa和Objective-C,但我對任何語言的解決方案都感興趣。
某些應用程序(如Photoshop)允許用戶從Web瀏覽器拖動圖片,或者將文件從文件系統中拖出到應用程序的停靠欄圖標上。這樣做會打開該應用程序中的文件。當文件,圖片等放在其停靠欄圖標上時,如何使OS X應用程序反應?
這是如何完成的?我想使用Cocoa和Objective-C,但我對任何語言的解決方案都感興趣。
如果您的應用程序是基於文檔的,並且您正確填寫了Info.plist中所需的密鑰,那麼它就是正常工作。當用戶將文件拖放到應用程序的Dock區塊時,如果文件是您註冊的類型,Dock會在您的應用程序上突出顯示您的應用程序,並且如果用戶將文件放在那裏,NSDocumentController會實例化一個文檔類爲文件。如果文件不是您註冊的類型,則兩者都將忽略它。
那麼,您的應用程序是基於文檔的?如果是這樣,那麼您的文件是您註冊的類型之一嗎?
欲瞭解更多信息:
的NSApplication允許您設置一個委託爲您的應用程序。如果用戶拖動文件到您的Dock圖標,會的NSApplication調用該方法
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
您的委託對象的
,如果它實現的任何這樣的方法。如果內容是不是一個真正的文件(例如,如果用戶只是在應用程序中選擇文本並拖動到你的Dock圖標),委託方法
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
被調用。
見NSApplication class reference
基本上你可以創建任何類型的對象(例如一個簡單的,只是繼承了NSObject的的)定義的上述對象中的兩個方法,然後隨時隨地在你啓動時的代碼你所做的應用程序
whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];
就是這樣。只要文件或其他內容被拖放到停靠欄圖標上,就會調用相應的方法,並且必須處理該請求。順便說一句,如果您的應用程序與文件類型相關聯(例如,.myFileType)並且用戶在Finder中雙擊具有該擴展名的文件,則會調用相同的方法。
幕後真正發生的事情是,啓動服務會向您的 應用程序發送「打開文檔」(「odoc」)Apple事件。 NSApplication默認爲這個事件註冊一個句柄,並通過調用適當的委託方法來轉發請求。我也可以直接聽這個蘋果事件,但你爲什麼?直接處理Apple事件很尷尬。當你的應用程序不是Cocoa,而是Carbon(普通C)時,你可能不得不直接處理Apple事件(我不熟悉Carbon),但是在Cocoa中Apple已經爲你提供了最重要的Apple事件並將其轉換轉換成您的應用程序可以收聽的委託電話或通知。
我不認爲你可以使用可可和C#。我只知道來自Ruby,Python和Objective-C的Cocoa綁定(根據我的理解,Objective-C是最好的支持)。雖然你可以使用C#和Mono編寫OS X應用程序,但我認爲你不能使用C#中的Cocoa。 – Andy 2009-02-01 16:35:08
搜索可可#安迪。 – 2009-02-01 16:37:56