滑动以删除被轻击两次

时间:2016-11-07 09:39:31

标签: ios swift uitableview

如何在表格视图中轻击两次轻扫以删除功能?它通过尝试两次删除数据或访问已删除的数据导致崩溃。

我正在谈论的滑动删除功能的示例: http://media.tumblr.com/25eb2fcf7aa2cd84f5cb27c54ca1ad5b/tumblr_inline_muotqqEYrY1qzumo9.jpg

与滑动删除功能相关的所有代码: http://pastebin.com/5VEbPvEC

这是要删除的代码:

//HTTP GET request to delete from server
//Then in:
DispatchQueue.main.async {
...
self.leaderboardData.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: .fade)
}

编辑:我也试过禁用用户互动:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    cell?.isUserInteractionEnabled = false

删除事件仍然被触发两次。

编辑2:

当我点击两次时,我得到了这个崩溃:

libswiftFoundation.dylib`static Foundation.IndexPath._unconditionallyBridgeFromObjectiveC (Swift.Optional<__ObjC.NSIndexPath>) -> Foundation.IndexPath:
    0x100c72914 <+0>:  stp    x20, x19, [sp, #-32]!
    0x100c72918 <+4>:  stp    x29, x30, [sp, #16]
    0x100c7291c <+8>:  add    x29, sp, #16              ; =16 
    0x100c72920 <+12>: mov    x19, x0
    0x100c72924 <+16>: cbz    x19, 0x100c7294c          ; <+56>
    0x100c72928 <+20>: mov    x0, x19
    0x100c7292c <+24>: bl     0x100c9ae14               ; function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Dead> of Foundation.IndexPath.init (nsIndexPath : __ObjC.NSIndexPath) -> Foundation.IndexPath
    0x100c72930 <+28>: mov    x20, x0
    0x100c72934 <+32>: mov    x0, x19
    0x100c72938 <+36>: bl     0x100cdc2e4               ; symbol stub for: objc_release
    0x100c7293c <+40>: mov    x0, x20
    0x100c72940 <+44>: ldp    x29, x30, [sp, #16]
    0x100c72944 <+48>: ldp    x20, x19, [sp], #32
    0x100c72948 <+52>: ret    
->  0x100c7294c <+56>: brk    #0x1

或者我看到其中一些:

/api/leaderboards/delete/132 returned 500.

500表示由于没有记录而无法删除记录。

只有当我混合出现的删除按钮时才会出现这种情况。

编辑3:

我已经更改了我的代码,现在将删除按钮混合不会导致崩溃,但每当我删除最后一行时,我都会崩溃。

代码: http://pastebin.com/57hMZQiJ

在第<:p>行触发断点

self.tableView.deleteRows(at: [indexPath], with: .fade)

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.5.2/UITableView.m:1610

感谢。

1 个答案:

答案 0 :(得分:0)

解决。所以我遇到了一些问题。

我试图在didSelectRowAt中禁用用户互动。而不是我现在做的func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)

我认为这解决了捣乱&#34;删除&#34;按钮问题。

然后,只有在删除最后一行时,我遇到崩溃的问题来自numRowsInSection的错误返回值。

当数据数组为空时,我加载占位符单元格,为用户提供有关操作的信息。这使得应用程序尝试读取不再存在的索引。所以我通过这样做解决了这个问题:

self.leaderboardData.remove(at: indexPath.row)
if self.tableView.numberOfRows(inSection: indexPath.section) == 1 {
    self.tableView.reloadData()
}
else {
    self.tableView.deleteRows(at: [indexPath], with: .fade)
}

当它到达一个时,我重新加载表数据,因为我的numOfRowsInSection看起来像这样:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var count = 0
    if leaderboardData.count < 1 {
        count = 1
    }
    else {
        count = leaderboardData.count
    }
    return count
}