为啥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 不起作用

低压内存条可以用在标压电脑上吗

为啥我的 UILabel 变量总是为零?

为啥我的 UILabel 的 AutoLayout 不起作用