ios - Swift 中的 Target-Action 参数问题
问题描述
我正在关注 iOS 开发教程并阅读他们的代码。第一个代码:
override func viewDidLoad() {
super.viewDidLoad()
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
gestureRecognizer.cancelsTouchesInView = false
tableView.addGestureRecognizer(gestureRecognizer)
}
第二个代码:
@objc func hideKeyboard(_ gestureRecognizer: UIGestureRecognizer) {
let point = gestureRecognizer.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point)
if indexPath != nil && indexPath!.section == 0 && indexPath!.row == 0 {
return
}
descriptionTextView.resignFirstResponder()
}
据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了 Target-Action 模式。
在第一个代码中#selector(hideKeyboard)
, hideKeyboard 似乎没有任何参数。那么为什么辅助函数中有参数(第二个代码)。
如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
?
我不太明白参数传递是如何工作的?
解决方案
AUIGestureRecognizer
总是将自己作为参数传递给action
处理程序方法。可以在处理程序例程中使用UIGestureRecognizer
,UITapGestureRecognizer
因为UIGestureRecognizer
它是 的超类UITapGestureRecognizer
,但在这种情况下传递的实际上是UITapGestureRecognizer
实例。
如果其他 s 不使用此处理程序例程UIGestureRecognizer
,我会这样写:
@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {
这允许您访问UITapGestureRecognizer
超类不常见的属性。
该selector
语法只是使用一种快捷语法,在这种情况下足以识别该方法。它可以用来#selector(hideKeyboard(_:))
表示有一个参数,但这不是必需的。
请注意,处理程序例程的参数必须是手势识别器。您不能替换其他类型,但如果您不需要访问手势识别器,则可以在处理程序例程中完全关闭该参数。
推荐阅读
- gnome - 失败:介子安装
- linux - cat: pid.txt: 没有这样的文件或目录
- java - 使用 DynamicDrawableSpan 将文本转换为图像时防止断字
- python - Discord.py 让机器人复制每条消息,包括文件
- go - 如何用协议缓冲区编组 *big.Int?
- css - Laravel链接href无效路径
- python-3.x - if-then 函数返回变量未定义
- mysql - 如果在 drop_all 之后立即调用,flask-SQLAlchemy create_all() 不会创建表
- c++ - Raspberry Pi 使用 Systemd 自动启动可执行文件,已加载但不活动(死)
- javascript - 向 Javascript HTML 游戏添加重置按钮?