如何在具有UIView的单元和视图控制器之间进行委托?

问题描述

我有一个包含表视图的视图控制器。在该表视图中,我有一个动态单元格。在该单元格内,我有一个UIView。在UIView内部,我有一个带有敲击识别器的标签,该标签应该对另一个视图控制器执行segue。我尝试通过将vc.delegate = self放入viewdidload中来在视图控制器之间创建委托,但是它不起作用。我也尝试过将同一行放入cellforrowat中,但它仍然无能为力。如何创建一个从我的单元格与UIView通信到此视图控制器的委托?另外,将要通信的是我的UIView类而不是我的单元格类。

解决方法

如果我正确理解。为您的单元格视图创建一个委托协议,将委托属性放到该单元格中,并通过tableView方法tableView(_:cellForRowAt:)传递给控制器​​。

协议实施:

protocol MyCellViewDelegate: class {
    func viewDidTap(_ view: MyCellView)
}

单元格视图实现:

class MyCellView: UIView {

    private let tapGesture = UITapGestureRecognizer()
    weak var delegate: MyCellViewDelegate?
        
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        tapGesture.addTarget(self,action: #selector (viewDidTap))
    }
    
    @objc
    func viewDidTap() {
        delegate?.viewDidTap(self)
    }
}

单元实施:

然后,在您的Cell实现中。将委托引用传递到MyCellView,它将在Controller中处理。

class MyCell: UITableViewCell {
    
    private let myContentView = MyCellView()
    
    weak var delegate: MyCellViewDelegate? {
        didSet { myContentView.delegate = delegate }
    }
    
    required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
    override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
        super.init(style: style,reuseIdentifier: reuseIdentifier)
    }
}

然后,您应该能够在TableView DataSource委托方法中设置委托。

控制器实现:

extension MyController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Dequeue the cell...
        cell.delegate = self
        return cell
    }
}

这将迫使您添加代表。

extension MyController: MyCellViewDelegate {
    
    func viewDidTap(_ view: MyCellView) {
        // Do some stuff
    }
}

但是,TableView可以“窃取”您的Tap Gesture动作。也许,如果您设置tableView.isUserInteractionEnabled = false,它可能会起作用。

,

简单方法是NotificationCenter。只需发布通知并在ViewController接收即可。

在需要传递以下信息时,请考虑通过使用委托来实现。我认为您在下面这样一个很高的层次是一个单独的类。

UIView -> [Cell -> TableView] -> UIViewController

您也可以使用完成处理程序。