将 UITapGestureRecognizer 添加到 XIB

Posted

技术标签:

【中文标题】将 UITapGestureRecognizer 添加到 XIB【英文标题】:Adding UITapGestureRecognizer to XIB 【发布时间】:2016-02-01 03:18:03 【问题描述】:

我创建了一个从 UITableViewHeaderFooterView 扩展的自定义 XIB,并尝试添加手势识别器。唯一的问题是尝试通过界面生成器添加识别器会导致对象被添加到顶层层次结构中,并且导致我的应用程序崩溃的以下错误:

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

据我所知,没有可用的“viewDidLoad”等效项,否则我只会以编程方式添加识别器。有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

你是对的,识别器一定不能添加到顶层的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 ]
    

有了这个,你可以直接听水龙头。我正在使用 RxSwift:

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

extension Reactive where Base: SettingsUserAvatarHeader 

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


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

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
    

【讨论】:

【参考方案2】:

试试这个

第一步:注册XIB文件

func regXib()
 self.tblList.register(UINib(nibName: "YourCellName", bundle: nil), forHeaderFooterViewReuseIdentifier: "YourCellNameIdentifierName")

步骤:- 2 viewForHeaderInSection 方法

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "YourCellNameIdentifierName") as! YourCellName
        let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.expand))
        cell.layer.backgroundColor = UIColor.white.cgColor
        cell.addGestureRecognizer(recognizer)
        cell.tag = section
        return cell
    

第 3 步:- 点击手势操作

@objc func expand(sender:UITapGestureRecognizer)
   let tag = (sender.view?.tag)!
   // Tap Action Code Here 

【讨论】:

以上是关于将 UITapGestureRecognizer 添加到 XIB的主要内容,如果未能解决你的问题,请参考以下文章

将 NSDictionary 作为参数传递给 UITapGestureRecognizer

将 UITapGestureRecognizer 添加到 UIControl

将 UITapGestureRecognizer 连接到 UIView

将 UITapGestureRecognizer 触摸传递到底层 UITableViewCell

将 UITapGestureRecognizer 添加到 XIB

将 UITapGestureRecognizer 添加到 UILabel 的特定部分的最佳方法是啥?