为啥UILabel TapGesture 只能在标签初始化后工作?
Posted
技术标签:
【中文标题】为啥UILabel TapGesture 只能在标签初始化后工作?【英文标题】:Why does UILabel TapGesture only work after label initialization?为什么UILabel TapGesture 只能在标签初始化后工作? 【发布时间】:2020-02-06 03:14:04 【问题描述】:我有以下代码来初始化标签:
let forgotPasswordLabel: UILabel =
let label = UILabel()
label.text = "Forgot password?"
label.font = ApplicationScheme.instance.containerScheme.typographyScheme.subtitle1
label.textColor = ApplicationScheme.instance.containerScheme.colorScheme.onPrimaryColor
label.textAlignment = .right
label.sizeToFit()
label.accessibilityRespondsToUserInteraction = true
label.isUserInteractionEnabled = true
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
稍后我将它添加到子视图中:
let passwordLabel = forgotPasswordLabel
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onForgotPasswordClick))
passwordLabel.addGestureRecognizer(tapGesture)
self.view.addSubview(passwordLabel)
如果我这样做,那么它工作正常,但是如果我将 tapGesture 代码放在标签 forgotPasswordLabel 初始化中,则不会触发点击手势。这是为什么呢?
不起作用的代码:
let forgotPasswordLabel: UILabel =
let label = UILabel()
label.text = "Forgot password?"
label.font = ApplicationScheme.instance.containerScheme.typographyScheme.subtitle1
label.textColor = ApplicationScheme.instance.containerScheme.colorScheme.onPrimaryColor
label.textAlignment = .right
label.sizeToFit()
label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onForgotPasswordClick))
label.addGestureRecognizer(tapGesture)
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
这与垃圾收集器有关吗? UILabel 无法识别的界限?还是别的什么?
【问题讨论】:
在forgotPasswordLabel不起作用的情况下,你能告诉你在哪里使用吗? 我在 viewDidLoad 方法中添加到子视图中作为简单的行 self.view.addSubview(forgotPasswordLabel) 看下面的解释应该可以帮助你理解背后的原因 【参考方案1】:以下代码中的tapGesture
被添加到Closure
初始化程序中,并且您将目标分配为self
,这是无效的。因为self
这里不是ViewController
let forgotPasswordLabel: UILabel =
let label = UILabel()
label.text = "Forgot password?"
label.font = ApplicationScheme.instance.containerScheme.typographyScheme.subtitle1
label.textColor = ApplicationScheme.instance.containerScheme.colorScheme.onPrimaryColor
label.textAlignment = .right
label.sizeToFit()
label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onForgotPasswordClick))
label.addGestureRecognizer(tapGesture)
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
在tapGesture
按预期工作的以下代码中,您将目标设置为self
,即ViewController
,这是有效的。
let forgotPasswordLabel: UILabel =
let label = UILabel()
label.text = "Forgot password?"
label.font = ApplicationScheme.instance.containerScheme.typographyScheme.subtitle1
label.textColor = ApplicationScheme.instance.containerScheme.colorScheme.onPrimaryColor
label.textAlignment = .right
label.sizeToFit()
label.accessibilityRespondsToUserInteraction = true
label.isUserInteractionEnabled = true
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let passwordLabel = forgotPasswordLabel
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onForgotPasswordClick))
passwordLabel.addGestureRecognizer(tapGesture)
self.view.addSubview(passwordLabel)
如果是tapGesture
,当您设置目标时,它会告诉您在手势发生时在哪里寻找action
【讨论】:
有没有一种方法可以在闭包内部而不是在闭包外部进行手势初始化? 有趣的问题,让我快速检查 我会说这种方法会产生更多问题,但如果我找到了最好的方法,我会在这里告诉你以上是关于为啥UILabel TapGesture 只能在标签初始化后工作?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好?
为 UITapGestureRecognizer 识别多个 UILabel 点击
Xcode 中的 Swift Playground - 到 UILabel 的 TapGestureRecognizer 不起作用