【问题标题】:Deleting rows in TableViewController after Swiping them in TableViewCell在 UITableViewCell 中滑动后删除 UITableViewController 中的行
【发布时间】:2016-07-27 20:17:32
【问题描述】:

我正在使用 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")
        }
    }
}

感谢阅读!

【问题讨论】:

    标签: xcode swift uitableview core-data uipangesturerecognizer


    【解决方案1】:

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

    向单元格添加协议定义:

    protocol EduDicTableViewCellDelegate {
        func didSwipeDelete(cell: UITableViewCell)
    }
    

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

    var delegate : EduDicTableViewCellDelegate? = nil
    

    handlePan方法中,添加一行释放pan时调用委托方法:

    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
    

    【讨论】:

    • 优秀。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2013-10-02
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多