Xcode 在TableViewCell中滑动TableViewController中的行后删除这些行

Xcode 在TableViewCell中滑动TableViewController中的行后删除这些行,xcode,swift,uitableview,core-data,uipangesturerecognizer,Xcode,Swift,Uitableview,Core Data,Uipangesturerecognizer,我正在用CoreData构建一个应用程序,使用UITableViewController.swift和UITableViewCell.swift 我正在尝试使用UITableViewCell.swift中的UIPangestureRecognitizer删除一行,就像在Clear to-do应用程序中一样。我可以左右平移行,但我不确定如何获取这些选定行的indexPath并在所有数据所在的UITableViewController.swift中删除它们 EduDicTableViewCell.s

我正在用CoreData构建一个应用程序,使用UITableViewController.swift和UITableViewCell.swift

我正在尝试使用UITableViewCell.swift中的UIPangestureRecognitizer删除一行,就像在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")
        }
    }
}
重写函数awakeFromNib(){
super.awakeFromNib()
let recognizer=UIPangestureRecognitizer(目标:自我,操作:#选择器(EdudicatableViewCell.handlePan(:))
recognizer.delegate=self
AddGestureRecognitor(识别器)
}
//标记:-水平平移手势方法
func handlePan(识别器:UIPangestureRecognitor){
// 1
如果识别器.state==.已开始{
//手势开始时,记录当前中心位置
原点=中心
}
// 2
如果识别器.state==.Changed{
let translation=识别器。translationView(自)
中心=CGPointMake(originalCenter.x+translation.x,originalCenter.y)
//用户是否已将项目拖得足够远,以启动删除/完成操作?
deleteOnDragRelease=frame.origin.x<-frame.size.width/2.0
}
// 3
如果识别器.state==.end结束{
设originalFrame=CGRect(x:0,y:frame.origin.y,
宽度:bounds.size.width,高度:bounds.size.height)
如果删除,请释放{
打印(“发送”)
}否则{
UIView.animateWithDuration(0.2,动画:{self.frame=originalFrame})
打印(“反弹”)
}
}
}

谢谢你的阅读

您可以在自定义单元格中使用委托/协议,该协议调用表视图控制器中的适当方法:

cell.delegate = self
将协议定义添加到单元格:

protocol EduDicTableViewCellDelegate {
    func didSwipeDelete(cell: UITableViewCell)
}
然后使用此协议添加一个(可选)
委托
变量:

var delegate : EduDicTableViewCellDelegate? = nil
class CustomTableViewController: UITableViewController, EduDicTableViewCellDelegate {
    ...
}
handlePan
方法中,添加一行以在pan释放时调用委托方法:

if deleteOnDragRelease {
    print("send it")
    self.delegate?.didSwipeDelete(self)
} else ...
请注意,
didSwipeDelete
方法传递被刷卡的单元格

在table view控制器中,添加删除单元格的方法(使用tableView的
indexPathForCell
方法获取与被扫描单元格对应的
indexPath
):

修改表视图控制器的类定义,以表明其采用了以下协议:

var delegate : EduDicTableViewCellDelegate? = nil
class CustomTableViewController: UITableViewController, EduDicTableViewCellDelegate {
    ...
}
最后,在
cellforrowatinexpath
方法中,将单元格上的
delegate
变量设置为
self
(表视图控制器):


杰出的非常感谢。