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

时间:2017-08-17 04:55:08

标签: ios swift uilabel uitapgesturerecognizer

我试图制作一个自己选择的冒险游戏,根据用户点击的标签更改两个标签的文本(用户选择)。我想我会做一个非常嵌套的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"
}

下图显示了我的要求:

here's a chart i made to help illustrate the logic

2 个答案:

答案 0 :(得分:1)

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

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

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]

                }
        }

}

我创建了一个名为Level的类来表示单个级别,每个级别包含子级别

Level.swift

import UIKit

class Level {
        var text: String?

        var subLevels: [Level]?


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

        }




}

答案 1 :(得分:0)

您必须在UITapGestureRecognizerUILabel中添加UIView无论是什么容器。

分别在每个函数IntusrChose1中添加2个不同的usrChose2变量,这些变量将用作计数器。

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)
}