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

Posted

技术标签:

【中文标题】如何检测是不是点击了 UI 标签?【英文标题】:How to detect if UI Label was tapped?如何检测是否点击了 UI 标签? 【发布时间】:2017-08-17 04:55:07 【问题描述】:

我正在尝试制作一个自己选择的冒险游戏,它会根据用户点击的标签来更改两个标签(用户选择)的文本。我想我会做一个非常嵌套的 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 语句中设置一个评估为真或假的条件?

这里是 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"

下图显示了我的要求:

【问题讨论】:

如果用户第二次点击choice1标签,你想做什么? @user1000 因此,如果点击了choice1,则两个标签将分别更新为“update1.1”和“update1.2”之类的内容。到目前为止,我可以做到这一点。但是游戏必须继续,所以如果用户点击choice1,现在显示为“update1.1”,这两个标签应该再次更新以提供两个新的选择,如“update1.1.1”和“1.1.2”跨度> 你是什么意思?比如什么? 如果您在标签上添加了手势,并且没有删除它。然后每次点击标签时都会调用手势方法(usrChose1、usrChose2)。那么这些功能只能工作一次是什么意思? @user1000 抱歉,我不小心按了“输入” 【参考方案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

        





【讨论】:

几乎!但那只会改变第一个标签并线性循环通过这些选项,没有考虑到如果用户选择一个选项,分支会发散并且某些选项现在被关闭 i.imgur.com/aWZf6W0.png 这是我为帮助说明而制作的图表! @glenohumeral13 你有两个标签,如果标签为选项 1 和选项 2,如果用户点击选项 1 标签,此标签将显示 1.1,当用户点击选项 2 标签时,此标签将显示2.1,我说的对吗?如果您可以显示标签的 UI,那么它将极大地帮助我们 是的,你是对的。我的用户界面是什么意思?喜欢故事板? @glenohumeral13 您在屏幕上有多少个标签?是的,如果可能的话故事板或在模拟器屏幕截图上运行【参考方案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)

【讨论】:

我认为,我在原始问题中使用代码 sn-p 以编程方式添加了两个(每个标签一个)。但我只是不知道如何反复检查标签是否被点击,比如有一个 if(tapped) 之类的东西

以上是关于如何检测是不是点击了 UI 标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode10 Ui 测试中点击标签的特定单词?

检测标签上的点击,在 ViewCell 内,在 ListView 内

如何在 tkinter Canvas 中检测点击对象的标签?

如何检测用户是不是点击了“返回”按钮

当用户直接点击标签栏项目时,如何禁用滑动动画?

unity区分点击在3D物体还是2D UI上