滑动以从 TableView 中删除不起作用
Posted
技术标签:
【中文标题】滑动以从 TableView 中删除不起作用【英文标题】:Swipe to delete from TableView not working 【发布时间】:2020-07-23 11:36:53 【问题描述】:我只是想将“滑动删除功能”添加到我的tableView
,据我所知,我唯一需要添加的是这两个功能:
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
return true
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
if editingStyle == .delete
self.deleteWishDelegate?.deleteWish(indexPath)
但这并没有做任何事情。我不能刷卡。我注意到一个奇怪的事情是我的整个View
上面有一个TransitionView
,我不知道它来自哪里。但是我可以在tableViewCell
中单击Button
,所以我认为它不会阻止任何东西。
有人知道这里发生了什么吗?如果您需要更多详细信息,请告诉我。
更新:
按照 cmets 中的建议,我使用了另一个函数来完成工作:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
let deleteAction = UIContextualAction(style: .destructive, title: "Löschen") _, _, completionHandler in
self.deleteWishDelegate?.deleteWish(indexPath)
completionHandler(true)
deleteAction.backgroundColor = .red
deleteAction.image = UIImage(systemName: "trash")
let configuration = UISwipeActionsConfiguration(actions: [deleteAction])
configuration.performsFirstActionWithFullSwipe = false
return configuration
还有我的 delteWsihDelegate 函数:
extension WishlistViewController: DeleteWishDelegate
func deleteWish(_ idx: IndexPath)
// remove the wish from the user's currently selected wishlist
wishList.wishes.remove(at: idx.row)
// set the updated data as the data for the table view
theTableView.wishData.remove(at: idx.row)
self.theTableView.tableView.deleteRows(at: [idx], with: .right)
print("deleted")
现在的问题是,我每滑动 20-30 次才有效。有谁知道为什么会发生这种情况?
更新 2
我发现了问题所在。我在同一个视图上还有另一个GestureRecognizer
。删除该功能后,该功能可以正常工作。有什么办法让两者同时工作?
【问题讨论】:
尝试使用func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
为什么你在表格视图的“提交编辑样式”方法上使用了“覆盖”。它可以在没有覆盖属性的情况下使用。
@Kirow 我在那里返回什么?
@AshutoshkumarMishra 因为我在 TableViewController 的子类中
你使用的是 UITableViewController 还是 UIViewController 类?
【参考方案1】:
UITableViewDelegate
实现方法
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath)
可用于配置滑动操作 - 在您的情况下为删除。这是我在一个项目中使用的示例:
extension ExampleViewController: UITableViewDelegate
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
let deleteAction = UIContextualAction(style: .destructive,
title: "Delete") [weak self] _, _, complete in
tableView.deleteRows(at: [indexPath], with: .automatic)
complete(true)
deleteAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [deleteAction])
// instead of a gesture recognizer you can use this delegate method
// it will be called whenever you tap on a cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
// whatever you gesture recognizer did
由于您在整个视图上的 GestureRecognizer 会给您带来麻烦,因此我建议您使用第三方实现或苹果公共 API 来处理关闭您的 viewController 而不是自己实现它。在这种情况下,您可以使用 viewController 的 UIModalPresentationStyle。
func startExampleViewController()
exampleViewController.modalPresentationStyle = .formSheet
previousViewController.present(exampleViewController, animated: true)
【讨论】:
感谢您的回答,您能看看我在问题中的更新吗? 你试过在主线程上运行那个委托方法吗?我不完全确定您的代表是如何构成的,但每 20-30 次成功表示动画延迟或代表设置时的竞争条件。 @Chris 我刚刚看到你的更新。您是否考虑过在删除操作开始之前删除 GestureRecognizer? 我认为你理解错了。它与删除数据无关。如果我还有其他 GestureRecognzier,我什至不能“滑动删除” 祝你好运,编码愉快:)【参考方案2】:我在 UITableViewController 中实现了删除动作,使用如下代码:-
class TestTableViewController: UITableViewController
var arrData = ["test1", "test111", "test11121", "test1121", "test121", "test1123", "test13213", "test165342", ]
override func viewDidLoad()
super.viewDidLoad()
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int
// #warning Incomplete implementation, return the number of sections
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// #warning Incomplete implementation, return the number of rows
return arrData.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
cell.title.text = arrData[indexPath.row]
cell.selectionStyle = .none
return cell
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
return true
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
if editingStyle == .delete
tableView.beginUpdates()
arrData.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .none)
tableView.endUpdates()
【讨论】:
感谢您的回答,但您能看看我更新的问题吗? 我在我们的项目中使用了您的“trailingSwipeActionsConfigurationForRowAt”方法,效果很好。能否添加“self.deleteWishDelegate?.deleteWish(indexPath)”方法的代码。 "extension WishlistViewController: DeleteWishDelegate",我认为你应该用“WhishlistTableViewController”更改扩展中的“WishlistViewController”类名。因为在顶部评论中您使用了“WhishlistTableViewController”作为 UITableViewController以上是关于滑动以从 TableView 中删除不起作用的主要内容,如果未能解决你的问题,请参考以下文章
REFrostedViewController 平移手势禁用 tableview 滑动
swift - 从 var(UITextField 输入)中删除空格不起作用