Xcode 中的 Swift Playground - 到 UILabel 的 TapGestureRecognizer 不起作用

Posted

技术标签:

【中文标题】Xcode 中的 Swift Playground - 到 UILabel 的 TapGestureRecognizer 不起作用【英文标题】:Swift Playground in Xcode - TapGestureRecognizer to UILabel not working 【发布时间】:2018-03-31 15:43:10 【问题描述】:

我正在 Xcode 中创建一个 Swift Playground,但在将 TapGestureRecognizer 放入 UILabel 时遇到问题...

class MyViewController : UIViewController 

  override func loadView() 

    func tapped() 

        print("The label was tapped!")

    

    let label11 = UILabel()
    label11.frame = CGRect(x: -350, y: 360, width: 350, height: 20)
    label11.text = "name."
    label11.textColor = .black
    label11.isUserInteractionEnabled = true
    view.addSubview(label11)

    let tap = UITapGestureRecognizer(target: self, action: "tapped")
    label11.addGestureRecognizer(tap)
  

【问题讨论】:

【参考方案1】:

您似乎正在以编程方式创建视图控制器,因为您仅在 loadView 中操作(您正确地没有调用 super),这需要您创建该控制器的实际 view

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController 

    override func loadView() 

        view = UIView()

        let label11 = UILabel()
        label11.frame = CGRect(x: 0, y: 360, width: 350, height: 20)
        label11.text = "name."
        label11.textColor = .yellow
        label11.isUserInteractionEnabled = true
        view.addSubview(label11)

        let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
        label11.addGestureRecognizer(tap)

    

    @objc func tapped() 
        print("The label was tapped!")
    



PlaygroundPage.current.liveView = MyViewController()

或者,您可以使用 viewDidLoad 复制非编程视图控制器(这需要您调用 super)。

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        let label11 = UILabel()
        label11.frame = CGRect(x: 0, y: 360, width: 350, height: 20)
        label11.text = "name."
        label11.textColor = .yellow
        label11.isUserInteractionEnabled = true
        view.addSubview(label11)

        let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
        label11.addGestureRecognizer(tap)

    

    @objc func tapped() 
        print("The label was tapped!")
    



PlaygroundPage.current.liveView = MyViewController()

另外,您的 origin-x 值超出了界限,这就是为什么您可能没有看到标签并且您缺少 Swift 4 中所需的 @objc 语法。

【讨论】:

对于任何可能不知道的人,要查看 Playground 中的视图控制器,请转到 View > Assistant Editor > Show Assistant Editor 这里的viewDidLoad 解决方案是更好的方法。

以上是关于Xcode 中的 Swift Playground - 到 UILabel 的 TapGestureRecognizer 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6 Beta / Swift - Playground 未更新

Swift 2.0 代码在 Xcode 中有效,但在 Playground 中无效

swift 来自Xcode Playground的文件处理

Xcode Playground 因非 Swift 代码而崩溃

NSDate() - Playground 与 Swift Xcode

Swift Playground 4:导入 Swift 包