2017-08-25 53 views
0

實現iOS 11在表格視圖中拖放。如果我不希望在第一行要拖呢,我以爲我返回從的tableView一個空數組(:itemsForBeginning :)爲什麼空的UIDragItem數組仍然允許拖動行?

func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { 
    if indexPath.row == 0 { 
     return [] 
    } 
    let dragItems = self.dragItems(forRowAt: indexPath) 
    print("dragging row index \(String(describing: dragItems.first?.localObject as? Int))") 
    return dragItems 
} 

返回一個空數組時不要讓用戶拖動內容 從指定的索引路徑。

但即使確認返回了[],仍會發生拖動。這意味着要麼我搞砸了,要麼這個功能沒有按照文件進行實施。我總是猶豫不決,認爲它是別人,所以我的問題是如果實現的[]的返回應該實際上阻止0行的拖動?任何人都證實這一點或顯示它按照記錄工作?

感謝

編輯:從WWDC視頻樣本代碼包括了這種大塊:

if tableView.isEditing { 
     // User wants to reorder a row, don't return any drag items. The table view will allow a drag to begin for reordering only. 
     return [] 
    } 

這是說,如果你不返回任何拖拉物品,表視圖將仍然允許拖動?!?!那麼如何防止行被拖拽呢?

+0

同樣的事情發生時,你只是'return []'? –

+0

是的,它爲純粹的'返回[]' – JKaz

+0

你允許編輯tableview,即舊的方式重新排序行嗎? – Losiowaty

回答

1

感謝@Losiowaty指向有用的方向。

我知道在tableView中,如果只有一個UIDragItem,那麼代理將查找tableView(:moveRowAt:)。我在任何地方都沒有看到記錄,它也檢查了tableView(:canMoveRowAt:),儘管現在看起來很明顯。

canMoveRowAt是這樣的:

// Override to support conditional rearranging of the table view. 
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
    // Return false if you do not want the item to be re-orderable. If coded that the first row is non-editable, that row is by definition also non-re-orderable 
    return true 
} 

注意方法中的註釋。我不知道我是否寫了評論或從某處複製它。我阻止了0行的編輯(在編輯模式下可刪除並重新排序),並讓它覆蓋canMoveRowAt,但在iOS 11拖放時顯然會被忽略。因此,解決辦法是要明確,如:

// Override to support conditional rearranging of the table view. 
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
    // Return false if you do not want the item to be re-orderable. 
    if indexPath.row == 0 {return false} 
    return true 
} 

診斷這樣的一個額外的複雜性在於,在iMessage的應用程序相同的代碼在iPad上沒有達到tableView(:moveRowAt:),但iPhone是達到那裏。對於iOS應用程序,在iPad和iPhone上均可使用tableView(:moveRowAt:),但這可能是單獨的問題。

相關問題