在TableViewCell中滑动后,删除TableViewController中的行

时间:2016-04-07 06:04:45

标签: xcode swift uitableview core-data uipangesturerecognizer

我使用UITableViewController.swift和UITableViewCell.swift构建了一个使用CoreData的应用程序。

我试图通过在UITableViewCell.swift中使用UIPanGestureRecognizer来删除清单待办事项中的行。我能够向左和向右平移行,但我不知道如何为所选行获取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")
        }
    }
}

感谢阅读!

1 个答案:

答案 0 :(得分:1)

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

向单元格添加协议定义:

protocol EduDicTableViewCellDelegate {
    func didSwipeDelete(cell: UITableViewCell)
}

然后使用此协议添加(可选)delegate变量:

var delegate : EduDicTableViewCellDelegate? = nil

handlePan方法中,添加一行以在发布平移时调用委托方法:

if deleteOnDragRelease {
    print("send it")
    self.delegate?.didSwipeDelete(self)
} else ...

请注意,didSwipeDelete方法会传递self - 刷过的单元格。

在表视图控制器中,添加删除单元格的方法(使用tableView的indexPathForCell方法获取与刷过的单元格对应的indexPath

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
        ...
    }
}

修改表视图控制器的类定义,以指示它采用协议:

class CustomTableViewController: UITableViewController, EduDicTableViewCellDelegate {
    ...
}

最后,在cellForRowAtIndexPath方法中,将单元格上的delegate变量设置为self(表格视图控制器):

cell.delegate = self