如何检测是不是点击了 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】:您必须在UILabel
或UIView
中添加UITapGestureRecognizer
,无论是容器。
分别在每个函数usrChose1
和usrChose2
中添加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 标签?的主要内容,如果未能解决你的问题,请参考以下文章
检测标签上的点击,在 ViewCell 内,在 ListView 内