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
- 这令人困惑。您应该清楚地将视图和控制器分开,并将它们中的哪一个处理什么。
我创建笔尖 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
创建了一个实例 - 您的
#selector
指的是self
,在本例中是 class 本身,而不是实例
nib
- 您为
因此,手势识别器指的是静态 (
class
) 函数handleBack
- 当您仔细查看+
符号时可以看到在异常文本中:reason: '+[Mat.AlertController handleBackWithSender:]: unrecognized selector
因此,要么使
handleBack
成为静态的 (class func
),要么提供一个实例作为目标(这就是你想要的,正如我所假设的那样)
所以
nib.back.addGestureRecognizer(UITapGestureRecognizer(target: nib, action: #selector(handleBack(sender:))))
应该适合你。
备注
尽管如此,让我给你一个设计提示:虽然你将它命名为 AlertController
,但它不是视图控制器,而是一个 UIView
- 这令人困惑。您应该清楚地将视图和控制器分开,并将它们中的哪一个处理什么。