以编程方式调用 tableView 单元格的 .delete editingStyle

Posted

技术标签:

【中文标题】以编程方式调用 tableView 单元格的 .delete editingStyle【英文标题】:Programmatically call a tableView cell's .delete editingStyle 【发布时间】:2018-12-09 22:25:46 【问题描述】:

我找到了一种通过使用delegate 方法以编程方式在我的 tableView 中选择一行的方法,就像这个答案中建议的那样:

https://***.com/a/40589905/3511695

现在我的每个 tableView 的单元格都有一个 .delete editingStyle 选项:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if (editingStyle == .delete) 
        // code that's called when user presses delete button
    

我如何以编程方式调用这个delete 函数?即模拟用户按下delete 按钮? (就像我能够以编程方式模拟按下 tableView 单元格一样)

我的if (editingStyle == .delete) 中有一个alertController,我需要再次显示它,这就是为什么我需要以编程方式模拟用户按下 UI 中的“删除”按钮,而不是简单地删除该行。

【问题讨论】:

真正的答案是。不要这样做。您有一个要更新的模型。当你更新模型时,视图控制器应该自动更新视图。不要将您的视图视为模型。使用 MVC 或其他架构并正确划分代码。 【参考方案1】:

您要查找的不是UITableViewDelegate 方法,而是UITableViewDataSource 方法。

这不是最好的解决方案,但如果您真的想这样做,请在 TableView 的 dataSource 上调用此方法,并作为参数传递您的 TableView,editingStyle 为.delete 和某些IndexPath

tableView.dataSource?.tableView!(tableView, commit: .delete, forRowAt: indexPath)

现在你应该做什么:

你应该把commit数据源方法中if语句的代码放到新方法中,然后你应该在这里调用这个方法

if (editingStyle == .delete) 
    method()

而不是调用tableView.dataSource?...

method()

【讨论】:

我的if (editingStyle == .delete) 中已经有该代码。那只是删除行。我想模拟用户按下delete 按钮。 (当用户按下delete 按钮时,我的代码中完成了更多操作,而不仅仅是删除行。) @velkoon 是的,所以只需调用我上面写的内容 我的if (editingStyle == .delete) 中出现了一个警报控制器,如果我只是执行yourTableView.deleteRows(at: [someIndexPath], with: .automatic),它就不会出现。我需要 if (editingStyle == .delete) 以编程方式执行,这样我的 alertController 才会出现。 完美!我还有一些故障排除要做,但这正是我需要的,谢谢 不要这样做。永远不要直接调用委托或数据源方法。如果你认为这是正确的,那你就错了。

以上是关于以编程方式调用 tableView 单元格的 .delete editingStyle的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift 3)

如何以编程方式将约束添加到 tableView 单元格的默认 textLabel 和 accessoryView

如果一切都是以编程方式创建而不使用情节提要,如何以编程方式调整 TableView 中单元格的高度?

如何以编程方式将约束添加到tableView单元格的默认textLabel和accessoryView

以编程方式向已以编程方式添加到表格单元格的标签添加约束

以编程方式设置静态单元格的详细文本标签