2011-12-19 21 views
8

我有一個處理市場營銷信息的簡單應用程序。我所做的就是致電接受Cocoa應用程序上的拖動文件

NSInteger result = [openPanel runModalForDirectory:nil file:nil types:fileTypes]; 

當用戶點擊File->Open菜單。現在我被要求將拖放功能添加到應用程序,以便用戶可以將文件拖動到該應用程序,而不必去菜單或按命令+ o打開文件。

之前你告訴我去閱讀文檔我已經檢查蘋果的Intro to drag and drop和其他文件。我仍然無法弄清楚該怎麼做。

我是一個老的Unix C程序員,需要複製這個,並且蘋果文檔中的一些假設對我沒有意義。

總之,什麼我需要添加到我的應用程序:

  1. 啓用拖放
  2. 句柄拖文件

作爲一個說明,我應該只處理一個文件一次。

感謝您的幫助

回答

15

那麼,你需要實現NSDraggingDestination協議,我想你已經讀過。您可以在特定視圖或整個窗口中實現它 - 聽起來像您正在接受應用程序級文件拖動,因此您可能希望整個窗口接受拖動。無論如何,一旦你得到它的工作,你會看到如何進一步定製它。

NSWindow子類。第一步是指定你是什麼類型的拖動的興趣

告訴它的興趣在文件名自定義窗口:

- (void)awakeFromNib { 
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 
} 

泰爾OS X什麼樣的光標來顯示:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender { 
    return NSDragOperationCopy; 
} 

執行阻力:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { 
    NSPasteboard *pboard = [sender draggingPasteboard]; 
    NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType]; 

    if (1 == filenames.count) 
     if ([[NSApp delegate] respondsToSelector:@selector(application:openFile:)]) 
      return [[NSApp delegate] application:NSApp openFile:[filenames lastObject]]; 

    return NO; 
} 

這是最起碼的得到它的工作。

+0

好的,謝謝你的信息。當我將'[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];''喚醒爲'awakeFromNib'時,我得到一個異常,並且:***由於未捕獲異常'NSInvalidArgumentException'而終止應用程序,原因:' - [MyAppAppDelegate registerForDraggedTypes:] :無法識別的選擇發送到實例0x100141330' – 2011-12-19 21:51:05

+0

哦,還添加'[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];'給我一個警告:方法-registerForDraggedTypes找不到 – 2011-12-19 21:52:04

+0

您需要調用該窗口或視圖的方法接受拖延。我更喜歡從窗口本身,在我的NSWindow子類中的'awakeFromNib'中調用它。 – 2011-12-19 21:53:38