如何检测 UI 标签是否被点击?

How to detect if UI Label was tapped?

我正在尝试制作一款自己选择的冒险游戏,该游戏会根据用户点击的标签更改两个标签(用户选择)的文本。我想我会做一个非常嵌套的 if-else 语句,而不是费心去尝试实现一个二叉树。我知道如何将手势识别器附加到标签(我认为):

let tapped1 = UITapGestureRecognizer(target: self, action: #selector(VCGame.usrChose1))  
choice1.isUserInteractionEnabled = true  
choice1.addGestureRecognizer(tapped1)  

let tapped2 = UITapGestureRecognizer(target: self, action: #selector(VCGame.usrChose2))  
choice2.isUserInteractionEnabled = true  
choice2.addGestureRecognizer(tapped2)  

并且我可以定义在 usrChose1 和 usrChose2 函数中触摸标签时要执行的操作,但是,这些函数只工作一次:第一次选择该函数并且我的游戏有不止一个选择。从那里开始,如果用户触摸标签,标签将执行相同的操作。

如果 label1 或 label2 被点击,我将如何在 if-else 语句中设置一个评估为 true 或 false 的条件?

这里是 usrChoice1 和 usrChoice2 的代码,用于说明

func usrChose1(sender : UITapGestureRecognizer) {
    print("tap 1 working")
    choice1.text = "choice1.1"
    choice2.text = "choice1.2"
}

func usrChose2(sender : UITapGestureRecognizer) {
    print("tap2 working")
    choice1.text = "update2.1";
    choice2.text = "update2.2"
}

下图是我的要求:

您必须在 UILabelUIView 中添加 UITapGestureRecognizer 任何容器。

在每个函数usrChose1usrChose2中分别添加2个不同的Int变量,作为一个计数器。

var i = 0
var j = 0
func usrChose1(_ recognizer: UITapGestureRecognizer) {
    i++
    print("Total clicked label 1 :::",i)
}
func usrChose2(_ recognizer: UITapGestureRecognizer) {
    j++
    print("Total clicked label 2 :::",j)
}

根据您的要求,我尝试了以下方法:

我在视图控制器中创建了一个带有两个标签的虚拟项目[​​=12=]

ViewController.swift

import UIKit

class ViewController: UIViewController {

        @IBOutlet weak var choice1Label: UILabel!

        @IBOutlet weak var choiceLabel2: UILabel!

        var tapStart: Bool = false

        var levelType1: Level?
        var levelType2: Level?

        override func viewDidLoad() {
                super.viewDidLoad()





                let tapped1 = UITapGestureRecognizer(target: self, action: #selector(usrChose1))
                choice1Label.isUserInteractionEnabled = true
                choice1Label.addGestureRecognizer(tapped1)

                let tapped2 = UITapGestureRecognizer(target: self, action: #selector(usrChose2))
                choiceLabel2.isUserInteractionEnabled = true
                choiceLabel2.addGestureRecognizer(tapped2)

                setup()

        }

        var currentLevel1: Level?
        var currentLevel2: Level?


        func setup() {
                let lb2Child1Child1 = Level(text: "2.1.1", subLevels: nil)
                let lb2Child1Child2 = Level(text: "2.1.2", subLevels: nil)


                let lb1Child1Child1 = Level(text: "1.1.1", subLevels: nil)
                let lb1Child1Child2 = Level(text: "1.1.2", subLevels: nil)

                let lb1Child2Child1 = Level(text: "1.2.1", subLevels: nil)
                let lb1Child2Child2 = Level(text: "1.2.2", subLevels: nil)

                let lb1Child1 = Level(text: "1.1", subLevels: [lb1Child1Child1, lb1Child1Child2])
                let lb1Child2 = Level(text: "1.2", subLevels: [lb1Child2Child1, lb1Child2Child2])


                let lb2Child1 = Level(text: "2.1", subLevels: [lb2Child1Child1, lb2Child1Child2])
                let lb2Child2 = Level(text: "2.2", subLevels: nil)


                levelType1 = Level(text: "1", subLevels: [lb1Child1, lb1Child2])
                levelType2 = Level(text: "2", subLevels: [lb2Child1, lb2Child2])
                choice1Label.text = levelType1!.text ?? ""
                choiceLabel2.text = levelType2!.text ?? ""


        }

        func usrChose1(sender : UITapGestureRecognizer) {

                if !tapStart {

                        currentLevel1 = levelType1

                        tapStart = true
                }

                if let subLevelsArray = currentLevel1?.subLevels {

                        print(subLevelsArray[0].text ?? "")
                        print(subLevelsArray[1].text ?? "")

                        choice1Label.text = subLevelsArray[0].text ?? ""
                        choiceLabel2.text = subLevelsArray[1].text ?? ""

                        currentLevel1 = subLevelsArray[0]
                        currentLevel2 = subLevelsArray[1]
                }


        }

        func usrChose2(sender : UITapGestureRecognizer) {
                //print("tap2 working")
               // choice1Label.text = "update2.1";
                //choiceLabel2.text = "update2.2"



                if !tapStart {


                        currentLevel2 = levelType2

                        tapStart = true
                }

                if let subLevelsArray = currentLevel2?.subLevels {

                        print(subLevelsArray[0].text ?? "")
                        print(subLevelsArray[1].text ?? "")
                        choice1Label.text = subLevelsArray[0].text ?? ""
                        choiceLabel2.text = subLevelsArray[1].text ?? ""
                        currentLevel1 = subLevelsArray[0]
                        currentLevel2 = subLevelsArray[1]

                }
        }

}

我制作了一个 class 命名级别来表示一个级别,每个级别都包含子级别

Level.swift

import UIKit

class Level {
        var text: String?

        var subLevels: [Level]?


        init(text: String, subLevels: [Level]?) {
                self.text = text
                self.subLevels = subLevels ?? nil

        }




}