簡體   English   中英

當文件,圖片等放在其停靠欄圖標上時,如何讓OS X應用程序做出反應?

[英]How do I make an OS X application react when a file, picture, etc is dropped on its dock icon?

某些應用程序(如Photoshop)允許用戶從Web瀏覽器拖動圖片,或將文件從文件系統拖到停靠欄中的應用程序圖標上。 這樣做會打開該應用程序中的文件。

這是怎么做到的? 我想使用Cocoa和Objective-C,但我對任何語言的任何解決方案感興趣。

NSApplication允許您為應用程序設置委托。 如果用戶將文件拖到停靠欄圖標上,NSApplication將調用該方法

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename

你的委托對象,如果它實現任何這樣的方法。 如果內容實際上不是文件(例如,如果用戶只選擇應用程序中的文本並將其拖放到停靠欄圖標上),則委托方法

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

叫做。

請參閱NSApplication類參考

基本上你可以創建任何類型的任何對象(例如,只是繼承NSObject的簡單對象),在對象中定義上面的兩個方法,然后在你啟動的應用程序代碼中的任何位置

whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];

就是這樣。 只要將文件或其他內容拖放到停靠欄圖標上,就會調用相應的方法並且必須處理該請求。 BTW如果您的應用程序與文件類型(例如.myFileType)關聯,並且用戶在Finder中雙擊具有該擴展名的文件,則會調用相同的方法。

幕后真正發生的事情是Launch Services向您的應用程序發送“開放文檔”('odoc')Apple Event。 NSApplication默認為此事件注冊一個句柄,並通過調用適當的委托方法轉發請求。 您也可以直接聽這個蘋果活動,但為什么會這樣? 直接處理Apple Events很尷尬。 當你的應用程序不是Cocoa,而是Carbon(plain-C)時,你可能不得不直接處理Apple Event(我不熟悉Carbon),但在Cocoa Apple已經為你捕獲了最重要的Apple Events並轉換它們進入您的應用程序可以收聽的委托電話或通知。

如果您的應用程序是基於文檔的,並且您在Info.plist中正確填寫了必要的密鑰,那么它就是Just Works。 當用戶將文件拖到應用程序的Dock磁貼上時,如果文件是您注冊的類型,Dock將在磁貼上突出顯示您的應用程序,如果用戶將文件放在那里,NSDocumentController將實例化您的一個文檔類文件。 如果該文件不是您注冊的類型,則兩者都將忽略該文件。

那么,您的應用程序是基於文檔的嗎? 如果是,該文件是您注冊的類型之一嗎?

欲獲得更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM