我创建了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)
这项工作很好,但如果我点击back button
我会收到以下错误:
2018-06-13 12:28:03.958448 + 0430 Mat [50493:243526] ***终止 应用程序由于未捕获的异常'NSInvalidArgumentException',原因: '+ [Mat.AlertController handleBackWithSender:]:无法识别的选择器 发送到类0x104db4e90'
但是,如果我使用下面的代码,工作正常:
@IBAction func xxx(_ sender: Any) {
print("LogIos => Y")
}
我想使用UITapGestureRecognizer
,因为我使用View
作为自定义按钮
答案 0 :(得分:2)
虽然我不明白你的意思" func xxx
工作正常" (如果使用与上面相同的代码,则不应该这样),问题是:
createAlert
是一个静态(class
)函数nib
AlertController
#selector
引用self
,在这种情况下是类本身,而不是实例因此,手势识别器会引用静态(class
)函数handleBack
- 当您仔细查看异常文本中的+
符号时可以看到:
原因:' + [Mat.AlertController handleBackWithSender:]:无法识别的选择器
因此,要么handleBack
为静态(class func
),要么提供一个实例作为目标(这就是我想要的,正如我所想的那样)
所以
nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))
应该适合你。
尽管如此,让我给你一个设计提示:虽然你将它命名为AlertController
,但它不是一个视图控制器,而是一个UIView
- 这很令人困惑。你应该清楚地分开视图和控制器,并分开哪些处理什么。