在 TableViewCell 中滑动后删除 TableViewController 中的行
Deleting rows in TableViewController after Swiping them in TableViewCell
我正在使用 UITableViewController.swift 和 UITableViewCell.swift 使用 CoreData 构建应用程序。
我正在尝试使用 UITableViewCell.swift 中的 UIPanGestureRecognizer 删除一行,就像在 Clear to-do 应用程序中一样。我可以向左和向右平移行,但我不确定如何为这些选定的行获取 indexPath 并在所有数据所在的 UITableViewController.swift 中删除它们。
EduDicTableViewCell.swift:
override func awakeFromNib() {
super.awakeFromNib()
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(EduDicTableViewCell.handlePan(_:)))
recognizer.delegate = self
addGestureRecognizer(recognizer)
}
//MARK: - horizontal pan gesture methods
func handlePan(recognizer: UIPanGestureRecognizer) {
// 1
if recognizer.state == .Began {
// when the gesture begins, record the current center location
originalCenter = center
}
// 2
if recognizer.state == .Changed {
let translation = recognizer.translationInView(self)
center = CGPointMake(originalCenter.x + translation.x, originalCenter.y)
// has the user dragged the item far enough to initiate a delete/complete?
deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
}
// 3
if recognizer.state == .Ended {
let originalFrame = CGRect(x: 0, y: frame.origin.y,
width: bounds.size.width, height: bounds.size.height)
if deleteOnDragRelease {
print("send it")
} else {
UIView.animateWithDuration(0.2, animations: {self.frame = originalFrame})
print("Bounced Back")
}
}
}
感谢阅读!
您可以在自定义单元格中使用 delegate/protocol,它会调用 table 视图控制器中的 suitable 方法:
向单元格添加协议定义:
protocol EduDicTableViewCellDelegate {
func didSwipeDelete(cell: UITableViewCell)
}
然后使用此协议添加一个(可选的)delegate
变量:
var delegate : EduDicTableViewCellDelegate? = nil
在handlePan
方法中,添加一行在放锅时调用delegate方法:
if deleteOnDragRelease {
print("send it")
self.delegate?.didSwipeDelete(self)
} else ...
请注意,didSwipeDelete
方法传递 self
- 被滑动的单元格。
在table视图控制器中,添加删除cell的方法(使用tableView的indexPathForCell
方法获取indexPath
对应的cell被刷了):
func didSwipeDelete(cell: UITableViewCell) {
if let indexPath = self.tableView.indexPathForCell(cell) {
print("didSwipeDelete \(indexPath.section) - \(indexPath.row)")
// remove the object at this indexPath from the data source
// and delete the corresponding table view row
...
}
}
修改 table 视图控制器的 class 定义,以表明它采用协议:
class CustomTableViewController: UITableViewController, EduDicTableViewCellDelegate {
...
}
最后,在 cellForRowAtIndexPath
方法中,将单元格上的 delegate
变量设置为 self
(table 视图控制器):
cell.delegate = self
我正在使用 UITableViewController.swift 和 UITableViewCell.swift 使用 CoreData 构建应用程序。
我正在尝试使用 UITableViewCell.swift 中的 UIPanGestureRecognizer 删除一行,就像在 Clear to-do 应用程序中一样。我可以向左和向右平移行,但我不确定如何为这些选定的行获取 indexPath 并在所有数据所在的 UITableViewController.swift 中删除它们。
EduDicTableViewCell.swift:
override func awakeFromNib() {
super.awakeFromNib()
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(EduDicTableViewCell.handlePan(_:)))
recognizer.delegate = self
addGestureRecognizer(recognizer)
}
//MARK: - horizontal pan gesture methods
func handlePan(recognizer: UIPanGestureRecognizer) {
// 1
if recognizer.state == .Began {
// when the gesture begins, record the current center location
originalCenter = center
}
// 2
if recognizer.state == .Changed {
let translation = recognizer.translationInView(self)
center = CGPointMake(originalCenter.x + translation.x, originalCenter.y)
// has the user dragged the item far enough to initiate a delete/complete?
deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
}
// 3
if recognizer.state == .Ended {
let originalFrame = CGRect(x: 0, y: frame.origin.y,
width: bounds.size.width, height: bounds.size.height)
if deleteOnDragRelease {
print("send it")
} else {
UIView.animateWithDuration(0.2, animations: {self.frame = originalFrame})
print("Bounced Back")
}
}
}
感谢阅读!
您可以在自定义单元格中使用 delegate/protocol,它会调用 table 视图控制器中的 suitable 方法:
向单元格添加协议定义:
protocol EduDicTableViewCellDelegate {
func didSwipeDelete(cell: UITableViewCell)
}
然后使用此协议添加一个(可选的)delegate
变量:
var delegate : EduDicTableViewCellDelegate? = nil
在handlePan
方法中,添加一行在放锅时调用delegate方法:
if deleteOnDragRelease {
print("send it")
self.delegate?.didSwipeDelete(self)
} else ...
请注意,didSwipeDelete
方法传递 self
- 被滑动的单元格。
在table视图控制器中,添加删除cell的方法(使用tableView的indexPathForCell
方法获取indexPath
对应的cell被刷了):
func didSwipeDelete(cell: UITableViewCell) {
if let indexPath = self.tableView.indexPathForCell(cell) {
print("didSwipeDelete \(indexPath.section) - \(indexPath.row)")
// remove the object at this indexPath from the data source
// and delete the corresponding table view row
...
}
}
修改 table 视图控制器的 class 定义,以表明它采用协议:
class CustomTableViewController: UITableViewController, EduDicTableViewCellDelegate {
...
}
最后,在 cellForRowAtIndexPath
方法中,将单元格上的 delegate
变量设置为 self
(table 视图控制器):
cell.delegate = self