2010-05-20 85 views
0

我最近開始另一個沒有賬戶的線程,所以我在這裏重新發佈一個賬戶的問題,所以我可以編輯當前鏈接到該程序,以便其他用戶可以關注這個。我也更新了下面的代碼。這是我原來的問題:可可NSOutlineView和拖放

我在這裏閱讀Outlineviews和DND的另一篇文章,但我無法讓我的程序工作。在這篇文章的底部是鏈接到我的項目的zip。它非常基本,只有大綱視圖和按鈕。我希望它接收到放在其上的文本文件,但是我的代碼或連接有問題。我試着按照Apple的NSOutline Drag and Drop的代碼示例,但我錯過了一些東西。 1區別是我的程序是一個基於文檔的程序,他們的例子不是。我將文件所有者設置爲接收委託操作,因爲這是處理拖放操作的代碼,以及按鈕操作。它可能是一個簡單的錯誤,所以有人可以看看它,並告訴我我做錯了什麼?這裏是一個鏈接到文件:http://dl.dropbox.com/u/7195844/OutlineDragDrop1.zip

+0

「我希望它接收到放在其上的文本文件」您是什麼意思?在大綱視圖中或在應用程序的Dock磁貼上放置? – 2010-05-24 05:57:27

+0

另外,不要忘記檢查'[super init]'的結果。不要以爲它成功了。你所有的'init'方法中的實例變量賦值應該在'if(self)'塊內。 (您也可以將這個任務集成到條件中,這在Cocoa代碼中很常見,但這取決於您的樣式首選項。) – 2010-05-24 06:03:06

回答

8

你沒有響應NSOutlineView的拖動驗證消息。

Your original code實施tableView:validateDrop:proposedRow:proposedChildIndex:。正如我在這個問題上指出的,當你的表格視圖是一個大綱視圖時,這是錯誤的; NSOutlineView不會發送表視圖拖動驗證消息,只會發送大綱視圖拖動驗證消息。

你從此改變你的拖驗證方法中聲明,如下所示:

- (NSDragOperation)outlineView:(NSOutlineView*)view 
       validateDrop:(id <NSDraggingInfo>)info 
       proposedRow:(int)row 
      proposedChildIndex:(NSInteger)index 

但沒有什麼實際發送這樣的消息。

請記住,NSOutlineView很少處理行索引,因爲它們可以在父行被展開和摺疊時更改。它處理的是「項目」,通常是模型對象。

因此,正確的驗證方法是:

- (NSDragOperation)outlineView:(NSOutlineView*)view 
       validateDrop:(id <NSDraggingInfo>)info 
       proposedItem:(id)item 
      proposedChildIndex:(NSInteger)index 

通知選擇器的第三組件的名稱,並連同它的參數的類型和名稱。

應用此更改後,您的數據源將驗證丟棄。