2017-08-25 43 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:),但这可能是单独的问题。

相关问题