将UITapGestureRecognizer添加到XIB

Ant*_*OSX 9 interface-builder uigesturerecognizer ios swift

我已经创建了一个从UITableViewHeaderFooterView扩展的自定义XIB,并尝试添加手势识别器.唯一的问题是尝试通过界面构建​​器添加识别器结果将对象添加到顶级层次结构中以及导致我的应用崩溃的以下错误:

由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'为标识符注册的无效nib(AccordionHeader) - nib必须包含一个必须是UITableViewHeaderFooterView实例的顶级对象'

据我所知,没有"viewDidLoad"等效可用,或者我只是以编程方式添加识别器.还有另一种方法吗?

Seb*_*oth 0

你是对的,识别器不能添加到顶层的 XIB 中。

我的解决方案如下:

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 ]
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就可以直接听到水龙头的声音。我正在使用 RxSwift:

首先,为水龙头添加扩展:

extension Reactive where Base: SettingsUserAvatarHeader {

    var avatarTap: ControlEvent<UITapGestureRecognizer> {
        return self.base.tapGestureRecognizer.rx.event.asControlEvent()
    }

}
Run Code Online (Sandbox Code Playgroud)

在你的控制器/委托等中:

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
    }
}
Run Code Online (Sandbox Code Playgroud)