如何解决如何在具有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 举报,一经查实,本站将立刻删除。