我有一个自定义的
UITableViewHeaderFooterView
,称为ProfileHeaderView
。它确实包含称为 UIImageView
的 userImage
。我如何访问此 userImage
以添加点击手势。
这是我的标题的代码片段:
class ProfileHeaderView: UITableViewHeaderFooterView {
// MARK: - Subviews
private var statusText: String = ""
lazy var userImage: UIImageView = {
let imageView = UIImageView(image: UIImage(named: me.login))
imageView.layer.cornerRadius = 45
imageView.clipsToBounds = true
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.isUserInteractionEnabled = true
return imageView
}()
...
}
这是我在
UIViewController
中使用的代码:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ProfileHeaderView")
view?.isUserInteractionEnabled = true
let tapPicture = UITapGestureRecognizer(
target: self,
action: #selector(didTapPicture)
)
tapPicture = 1
view?.userImage.addGestureRecognizer(tapPicture)
return view
}
return nil
}
我确实收到以下错误:
Value of type 'UITableViewHeaderFooterView' has no member 'userImage'
。为什么?我想我将 userImage 添加到我的标题中。但事实证明将其添加到我的自定义标头中还不够。有没有任何解决方法或解决方案可以添加 tapGesture
到它?
dequeueReusableHeaderFooterView
返回 UITableViewHeaderFooterView
,它没有 userImage
属性,因此会出现错误。
您所需要做的就是将
dequeueReusableHeaderFooterView
的结果转换为 ProfileHeaderView
。
if let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ProfileHeaderView") as? ProfileHeaderView {
view.isUserInteractionEnabled = true
let tapPicture = UITapGestureRecognizer(
target: self,
action: #selector(didTapPicture)
)
tapPicture = 1
view.userImage.addGestureRecognizer(tapPicture)
return view
}
这样做的一个问题是,当用户滚动时,您最终会向标题添加越来越多的手势识别器。
更好的整体解决方案是在自定义标头类中设置手势并定义委托或回调属性。然后,当自定义标头处理点击时,它可以调用委托或回调,以便视图控制器可以根据需要进行操作。