在TableViewCell中删除行后在TableViewController中删除行

问题描述:

我使用UITableViewController.swift和UITableViewCell.swift构建了一个包含CoreData的应用程序。在TableViewCell中删除行后在TableViewController中删除行

我试图通过在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") 
     } 
    } 
} 

感谢您的阅读!

你可以在你的自定义单元格,这就要求在表视图控制器适当的方法使用委托/协议:

协议定义添加到单元格:

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(表VI ew控制器):

cell.delegate = self 
+0

这是完美的!感谢数百万! –

+0

非常好。谢谢! – Ibrahim