我创建 Nib 类:
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")
}
}
然后在另一个类上使用它:
let view = AlertController.createAlert()
viewMain.addSubview(view)
这工作正常,但如果我点击后退按钮
,我会得到以下错误:
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
works fine”是什么意思(如果你使用与上面相同的代码,这不应该),问题是:
createAlert
是一个静态(class
)函数- 内部
- 您为您的
AlertController
创建一个实例nib
- 您的
#selector
引用self
,在本例中是类 本身,而不是实例
- 您为您的
因此,手势识别器指的是静态 (
class
) 函数handleBack
- 当您仔细查看+ 时,您会发现它
登录异常文本:reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector
因此,要么使
handleBack
成为静态的(class func
),要么提供一个实例作为目标(这是您想要的,就像我一样假设)
所以
nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))
应该适合你。
备注
尽管如此,让我给您一个设计提示:虽然您将其命名为 AlertController
,但它不是 View Controller ,而是 UIView
- 这令人困惑。您应该清楚地将 View 和 Controller 分开,并将它们中的哪一个处理什么。
关于Swift:终止 nib 类的应用程序 UITapGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50832101/