2017-10-12 120 views
1

我想使用iOS 11的方式在表视图行中添加滑动操作。我想添加一个操作来删除一行。UITableView - 破坏性的UIContextualAction不重新载入数据

我的测试表视图显示数字0到9,数据源是一个整数的简单阵列,称为numbers

class ViewController: UIViewController { 
    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
} 

当我选择一排,我打印的numbers关联值:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print(numbers[indexPath.row]) 
    tableView.deselectRow(at: indexPath, animated: true) 
} 

我实现如下的新的委托trailingSwipeActionsConfigurationForRowAt

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { 

    let delete = UIContextualAction(style: .destructive, title: "Delete") { (_, _, completionHandler) in 
     self.numbers.remove(at: indexPath.row) 
     completionHandler(true) 
    } 

    return UISwipeActionsConfiguration(actions: [delete]) 
} 

当我在一行上滑动时,删除工作正常。但是,这是我的问题,当我删除后选择另一行,相关IndexPath是错误的...

例子:

  • 我选择第一行,打印的值是0:OK。
  • 我删除第一行。
  • 我选择新的第一行,打印的值是2,因为参数中传入的IndexPath是第1行,而不是第0行:不正确。

我该怎么做错误的方式?

回答

3

重要的是要记住,有一个模型,您的案例中的numbers数组,以及显示的单元格视图。当您从numbers中删除元素时,您只会更新模型。

在大多数情况下,由于模型与视图不同步,因此您将在稍后收到错误代码。

但是,我的测试表明,当风格是.destructive,你通过truecompletionHandler苹果有点为你排除行。这就是为什么你看到该行消失。但有些事情不太对,关于它我找不到任何文档。

在此期间,只是这样做:

self.numbers.remove(at: indexPath.row) 
tableView.deleteRows(at: [indexPath], with: .automatic) 
completionHandler(true) 

永远记住,如果你与模型改变你需要更新视图。

+0

感谢您的支持!我对完成处理程序缺少文档感到困惑。作为传递给'UIContextualAction'初始值设定项的闭包模块中的一个参数,我想这不是我们可以定义的东西吗? – aganders3