Swift:终止 nib 的应用程序 UITapGestureRecognizer class

Swift: Terminating app UITapGestureRecognizer for nib class

我创建笔尖 class :

import UIKit

class AlertController: UIView {
    @IBOutlet weak var back: UIView!
    @IBOutlet weak var viewMain: UIView!

    class func createAlert() -> AlertController {
        let myNib = UINib(nibName: "Alert", bundle: nil)
        let nib = myNib.instantiate(withOwner: nil, options: nil)[0] as! AlertController

        nib.back.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleBack(sender:))))

        return nib
    }

    @objc func handleBack(sender: UITapGestureRecognizer) {
        //viewMain.isHidden = true
        print("LogIos => X")
    }
}

并在另一个 class 上使用它:

let view = AlertController.createAlert()
viewMain.addSubview(view)

这个工作正常,但是如果我点击 back button 我会得到以下错误:

2018-06-13 12:28:03.958448+0430 Mat[50493:243526] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector sent to class 0x104db4e90'

但是如果我使用下面的代码,工作正常:

@IBAction func xxx(_ sender: Any) {
    print("LogIos => Y")
}

我想使用 UITapGestureRecognizer 因为我使用 View 作为自定义按钮

虽然我不明白你所说的“func xxx 工作正常”是什么意思(如果你使用与上面相同的代码,这不应该),问题是:

  • createAlert 是静态 (class) 函数
  • 内部
    • 您为 AlertController
    • 创建了一个实例 nib
    • 您的 #selector 指的是 self,在本例中是 class 本身,而不是实例
  • 因此,手势识别器指的是静态 (class) 函数 handleBack - 当您仔细查看 + 符号时可以看到在异常文本中:

    reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector

  • 因此,要么使 handleBack 成为静态的 (class func),要么提供一个实例作为目标(这就是你想要的,正如我所假设的那样)

所以

nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))

应该适合你。

备注

尽管如此,让我给你一个设计提示:虽然你将它命名为 AlertController,但它不是视图控制器,而是一个 UIView - 这令人困惑。您应该清楚地将视图和控制器分开,并将它们中的哪一个处理什么。