微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在具有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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。