Haklısınız, tanıyıcı en üst düzeydeki XIB'ye eklenmemelidir.
Çözümümün şöyle: Bununla
class SettingsUserAvatarHeader: UITableViewHeaderFooterView {
// Set as a variable, as it will be re-created on cell re-use
var tapGestureRecognizer = UITapGestureRecognizer()
// This will be called every time the cell moves off screen and returns
override func prepareForReuse() {
super.prepareForReuse()
// Needs to be done manually.
tapGestureRecognizer = UITapGestureRecognizer()
avatarImageView.gestureRecognizers = [ tapGestureRecognizer ]
}
// This will be needed for the first display
override func didMoveToSuperview() {
super.didMoveToSuperview()
avatarImageView.gestureRecognizers = [ tapGestureRecognizer ]
}
}
doğrudan musluklar dinleyebilirsiniz. Ben RxSwift kullanıyorum:
Birincisi, musluğu için bir uzantı eklemek:
extension Reactive where Base: SettingsUserAvatarHeader {
var avatarTap: ControlEvent<UITapGestureRecognizer> {
return self.base.tapGestureRecognizer.rx.event.asControlEvent()
}
}
Ve denetleyicisi/temsilci vb:
class Consumer: UITableViewDelegate {
var avatarTapDisposable: Disposable?
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "userAvatarView")
let view = cell as! SettingsUserAvatarHeader
avatarTapDisposable =
view.rx
.avatarTap
.subscribe(onNext: { (tap) in
// Here your code for the tap
})
return cell
}
}