6

我正在編寫需要接受文件夾丟棄的自定義視圖。條件是:只接受目錄,所以當用戶拖拽文件時不會發生任何事情。拖放 - 僅接受文件夾

我登記我的看法有:

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 

的基本拖動協議的方法都已經實現了。出於測試目的:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender 
{ 
    NSLog("@Drag Entered"); 
    return NSDragOperationCopy; 
} 

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

- (void)draggingExited:(id<NSDraggingInfo>)sender 
{ 
    NSLog(@"Dragging Exited"); 
} 

- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender { return YES; } 
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { return YES; } 

因此,它的工作原理幾乎是正確的:當拖動視圖時,光標變爲加號。不過,如果該項目是普通文件,我想避免這種情況。

我可能需要使用NSFileManager來做到這一點(雖然我不知道是否有更簡單的方法),一旦我得到拖動的路徑,但問題是在哪裏。我試圖在draggingEntered:方法中包含測試權限,但返回NSDragOperationNone沒有成功。我從蘋果文檔下面的代碼段:

{ 
    NSPasteboard *pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSFilenamesPboardType]) { 
     NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 
     int numberOfFiles = [files count]; 
     // Perform operation using the list of files 
    } 
    return YES; 
} 

我應該在哪裏實施這個測試,所以如果一個文件被拖到不是光標保持不變?

回答

6

如果粘貼板包含文件,則應在-draggingEntered:中執行測試並返回NSDragOperationNone

但是,由於您還實施了‑draggingUpdated:,因此您還需要將文件夾類型的測試添加到該方法中。

目前你總是在‑draggingUpdated:返回NSDragOperationCopy未經測試的文件類型,這意味着只要您拖動目標中的鼠標移動時,光標會變成一個副本光標不管你在‑draggingEntered:做什麼。

請注意,實施‑draggingUpdated:是可選的。如果您未實現具有多個可能的拖動目標的複雜視圖,則不需要實現它,只需要‑draggingEntered:‑draggingExited:

+0

呵呵,正如我在文中所說的,我已經在'draggingEntered:'中實現了測試,但是通過'draggingUpdated:'錯過了這一點。剛剛刪除它。非常感謝! – sidyll 2011-06-02 13:45:03

+0

理想情況下,在一個單獨的方法中實施一次測試,並從'draggingEntered:'和'draggingUpdated:'發送自己的消息。 – 2011-06-04 02:39:56