ios - 将选择器从 UIViewController 传递给 UIView
问题描述
我创建了一个继承自 UIView 的自定义类,BlueView
. 我的 UIViewController 中有一个方法,我想BlueView
在用户点击时调用它。但是,每当我点击 时,我的程序就会崩溃,但BlueView
出现以下异常:
2019-09-15 23:06:14.960704-0400 DoubleViewApp[2418:70709] -[DoubleViewApp.BlueView handleBlueTapWithSender:]: unrecognized selector sent to instance 0x7f820cd06790
界面视图:
import UIKit
class BlueView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
createSubview()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createSubview()
}
func createSubview() {
print("createSubview from BlueView")
backgroundColor = .blue
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
addGestureRecognizer(tap)
}
func setTapGesture(action: Selector?) {
let tap = UITapGestureRecognizer(target: self, action: action)
addGestureRecognizer(tap)
}
@objc func handleTap(sender: UITapGestureRecognizer? = nil) {
print("NO! DO NOT TAP THE BLUE SQUARE.")
}
}
视图控制器:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("Hello World")
// Do any additional setup after loading the view.
let bview = BlueView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let rview = RedView(frame: CGRect(x: 0, y: 300, width: 300, height: 300))
view.addSubview(bview)
view.addSubview(rview)
bview.setTapGesture(action: #selector(handleBlueTap(sender:)))
}
@objc func handleBlueTap(sender: UITapGestureRecognizer? = nil) {
print("This is a funny message.")
//Todo: Present new ViewController
}
}
解决方案
您还必须为选择器设置正确的目标。目前,您将目标设置为BlueView
实例,但您希望它成为视图控制器。
class BlueView: UIView {
...
func setTapGesture(target: Any?, action: Selector?) {
addGestureRecognizer(UITapGestureRecognizer(target: target, action: action))
}
...
}
& 然后你可以使用:
bview.setTapGesture(target: self, action: #selector(handleBlueTap(sender:)))
推荐阅读
- xamarin.forms - ViewModel 中的命令
- javascript - ReactJS - 使用材质 UI 网格间距
- php - 使用 symfony/panther 进行测试时调用未定义的方法 assertPageTitleContains()
- c++ - 为什么 GL_RASTERIZER_DISCARD 不能让我写入模板缓冲区?
- google-bigquery - 将 Firebase 自定义事件导入 Bigquery
- arrays - 根据其他相关数组确定一个数组的元素位置
- jax-rs - 在 Quarkus 本机中运行的 JAX-RS 应用程序中使用 Jedis 池会导致 ClassNotFoundException:org.apache.commons.pool2.impl.DefaultEvictionPolicy
- html - 我在哪里可以找到这个“历史”符号作为字符?
- javascript - 这样做的正确方法是什么?我得到未定义的结果,因为该变量尚未被赋值
- php - Laravel ErrorException(代码:0):stdClass类的对象无法转换为字符串