Help us understand the problem. What is going on with this article?

<Swift>UITableViewHeaderFooterViewのlabelにUITapGestureRecognizerを設定しても動作しない

UITableViewHeaderFooterViewで設定する場合

TopTableSectionHeaderView.swift
import UIKit
import RxSwift

class TopTableSectionHeaderView: UITableViewHeaderFooterView {

    @IBOutlet weak var categoryNameLabel: UILabel!

    @IBOutlet weak var categoryAddButton: UIButton!

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        commonInit()
    }

    func commonInit(){
        let _view = UINib(nibName: "TopTableSectionHeaderView", bundle: nil)
            .instantiate(withOwner: self, options: nil)
            .first as! UIView

        _view.frame = bounds
        _view.backgroundColor = .green
        addSubview(_view)
        _view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // うまくいく(printが実行される)
        let categoryAddButtonObservable = categoryAddButton.rx.tap.asObservable()
        categoryAddButtonObservable.subscribe(
            onNext: { [weak self] in
            print("rxButton")
            }
        )

        // うまくいかない(printが実行されない)
        let tapGesture = UITapGestureRecognizer()
        tapGesture.rx.event.bind(onNext: { recognizer in
            print("rxLabel")
        }).disposed(by: DisposeBag())
        _view.addGestureRecognizer(tapGesture)

        // うまくいかない(printが実行されない)
        let tapLabelGesture = UITapGestureRecognizer(target: self, action: #selector(labelDidTap(_:)))
        categoryNameLabel.addGestureRecognizer(tapLabelGesture)
    }

    @objc func labelDidTap(_ sender: UITapGestureRecognizer) {
        print("label")
    }
}

★補足

TopTableSectionHeaderView.swift
import UIKit

class TopTableSectionHeaderView: UITableViewHeaderFooterView {

    @IBOutlet weak var categoryNameLabel: UILabel!

    @IBOutlet weak var categoryAddButton: UIButton!

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        commonInit()
    }

    func commonInit(){
        let _view = UINib(nibName: "TopTableSectionHeaderView", bundle: nil)
            .instantiate(withOwner: self, options: nil)
            .first as! UIView

        _view.frame = bounds
        _view.backgroundColor = .green
        addSubview(_view)
        _view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // うまくいく(printが実行される)
        let tapViewGesture = UITapGestureRecognizer(target: self, action: #selector(viewDidTap(_:)))
        _view.addGestureRecognizer(tapViewGesture)

    }

    @objc func viewDidTap(_ sender: UITapGestureRecognizer) {
        print("view")
    }
}

ViewControlloerで設定する場合

TopViewController.swift
extension TopViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "TopTableSectionHeaderView")
        if let v = view as? TopTableSectionHeaderView {
            v.setText("cate header!!!")
        }

        // うまくいく(printが実行される)
        let gesture = UITapGestureRecognizer(target: self, action: #selector(sectionHeaderDidTap(_:)))
        view?.addGestureRecognizer(gesture)
        view?.tag = section

        // うまくいく(printが実行される)
        let tapGesture = UITapGestureRecognizer()
        view?.addGestureRecognizer(tapGesture)
        tapGesture.rx.event.bind(onNext: { recognizer in
            print("rx")
        }).disposed(by: disposeBag)

        return view
    }

    @objc func sectionHeaderDidTap(_ sender: UITapGestureRecognizer) {
        print("tag \(sender.view?.tag)")
    }
}
TopViewController.swift
extension TopViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "TopTableSectionHeaderView")
        if let v = view as? TopTableSectionHeaderView {
            v.setText("cate header!!!")

            // うまくいかない(printが実行されない)
            let tapGesture = UITapGestureRecognizer()
            v.categoryNameLabel.addGestureRecognizer(tapGesture)
            tapGesture.rx.event.bind(onNext: { recognizer in
                print("rx")
            }).disposed(by: disposeBag)

            // うまくいかない(printが実行されない)
            let gesture = UITapGestureRecognizer(target: self, action: #selector(sectionHeaderLabelDidTap(_:)))
            v.categoryNameLabel.addGestureRecognizer(gesture)
            v.categoryNameLabel.tag = section   
        }
        return view
    }

    @objc func sectionHeaderLabelDidTap(_ sender: UITapGestureRecognizer) {
        print("tag \(sender.view?.tag)")
    }
}
mas821
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away