我正在使用滑动删除tableview中的功能来删除所选单元格。您向左滑动以显示删除按钮。我的代码运行良好,删除它应该。
我还包括一个UIAlertController,为应用程序的用户提供一个错误的最后机会。我想做的是,如果用户选择"取消"有细胞" un-swipe"并回到原来的位置。有没有办法做到这一点?
答案 0 :(得分:5)
您可以关闭tableView上的编辑
[self.tableView setEditing:NO animated:YES];
答案 1 :(得分:0)
我有一个类似的问题,发现你的问题正在寻找答案。基于这里缺乏答案,我认为我必须自己解决这个问题。这是我的问题以及我是如何解决它的。我希望它对你有用,因为我解决它非常简单。
我有一个带有开始屏幕的应用,该屏幕显示包含多个曲目的表格。选择曲目时,您可以显示曲目详细信息,在地图上显示曲目(使用MapView)或删除曲目。
但是,当您第一次使用该应用程序时,该表为空并显示一个表格单元格:“没有保存的曲目”。
这意味着该表为空,您无法显示曲目详细信息,曲目地图或删除曲目。我想确保如果表格为空,则会收到不同的消息,并且左侧滑动将被撤消。
代码是funk -tableView的一个副本:editActionsForRowAtIndexPath indexPath:
override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let selectedRow = indexPath.row
guard self.savedTracks.count > 0 else {
//There are no saved tracks, the action cannot be executed.
let faultAction = UITableViewRowAction(style: .Normal, title: "No tracks", handler: { (action, indexPath) -> Void in
self.trackOverviewTable.reloadData() //Simply reload the table view after the action button is hit.
})
return [faultAction]
}
//Show track details
let detailsAction = UITableViewRowAction(style: .Default, title: "Details") { (action, indexPath) -> Void in
print("I now selected the track details view.\n")
self.newTrack = self.savedTracks[selectedRow]
self.performSegueWithIdentifier("showTrackDetails", sender: self)
}
//Show track map
let mapAction = UITableViewRowAction(style: .Normal, title: "Map") { (action, indexPath) -> Void in
print("I now selexted the track map view.\n")
self.newTrack = self.savedTracks[selectedRow]
self.performSegueWithIdentifier("showTrackMap", sender: self)
}
//Delete the selected track
let deleteAction = UITableViewRowAction(style: .Default, title: "Delete") { (action, indexPath) -> Void in
print("I now pressed the delete button.\n")
self.savedTracks.removeAtIndex(selectedRow)
if self.savedTracks.count > 0 {
self.trackOverviewTable.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else {
self.trackOverviewTable.reloadData()
}
}
detailsAction.backgroundColor = UIColor(colorLiteralRed: 21.0/255.0, green: 175.0/255.0, blue: 253.0/255.0, alpha: 0.8)
mapAction.backgroundColor = UIColor(colorLiteralRed: 37.0/255.0, green: 155.0/255.0, blue: 253.0/255.0, alpha: 0.8)
return [deleteAction, mapAction, detailsAction]
}
这里的重要部分是“guard else”语句,其中代码在没有保存轨道时执行。基本上,swipi显示不同的消息“No tracks”,当单击此操作按钮时,将重新加载表格并撤消滑动。由于您使用UIAlertController,因此适用相同的原则。上述方法与UIAlertController几乎完全相同,您也可以在用户选择“取消”按钮后重新加载表。
正如我所说,它非常简单,可能无法满足您的期望,但在用户点击“取消”后,它会取消擦除左侧滑动。我希望它适合你。
答案 2 :(得分:0)
我遇到了这个试图做同样事情的问题。我认为必须有一个更好的解决方案,重新加载表,所以我做了一些进一步的研究,并找到了以下。
tableView.setEditing(false, animated: true)
这里有更多代码(Swift 3)来显示它正在使用中
// Custom cell edit actions
func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: .destructive, title: "Delete") {(rowAction: UITableViewRowAction, indexPath: IndexPath) -> Void in
let refreshAlert = UIAlertController(title: "Delete", message: "Are you sure you want to delete this item.", preferredStyle: UIAlertControllerStyle.alert)
refreshAlert.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (action: UIAlertAction!) in
let context = self.fetchedResultsController.managedObjectContext
context.delete(self.fetchedResultsController.object(at: indexPath))
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}))
refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action: UIAlertAction!) in
// if the user presses cancel, slide the cell back
tableView.setEditing(false, animated: true)
}))
self.present(refreshAlert, animated: true, completion: nil)
}
let editAction = UITableViewRowAction(style: .normal, title: "Edit") { action, index in
print("edit button tapped")
}
editAction.backgroundColor = .orange
return [editAction, delete]
}
答案 3 :(得分:0)
我采用了这种方法,效果很好
private func onDeleteNote(noteIdx: Int) {
let noteToDelete: Note = myNotes[noteIdx]
let alertViewController = UIAlertController(title: "¿Would you like to delete this note?", message: "The Note \(noteToDelete.title) will be delete", preferredStyle: .alert)
alertViewController.addAction(UIAlertAction(title: "Delete", style: .destructive) { (UIAlertAction) in
print("Delete note")
})
alertViewController.addAction(UIAlertAction(title: "Cancel", style: .cancel) { (UIAlertAction) in
print("Delete note was cancel")
self.myNotesTable.reloadRows(at: [IndexPath(row: noteIdx, section: 0)], with: .right)
})
present(alertViewController, animated: true, completion: nil)
}
当用户取消操作时,我尝试重新加载此表格单元格以放弃滑动状态。