如何在 Swift 中使用 UIKit 注册多个按钮点击?

Posted

技术标签:

【中文标题】如何在 Swift 中使用 UIKit 注册多个按钮点击?【英文标题】:How to register more than one button tap using UIKit in Swift? 【发布时间】:2016-03-29 18:29:20 【问题描述】:

我正在尝试使用按钮,但遇到了一个可能很简单的问题。我有两个按钮和两个标签。

标签生成随机字符串值“A”或“B”。如果选择了适当的按钮,我希望正确的标签消失。

我想出了以下代码,但遇到了问题。如果字母相同,则点击相应按钮时两个标签都将隐藏。

我想我理解为什么会这样。这是因为我的代码在按钮A被点击一次时执行(我还没有开始按钮B,所以它没有做任何事情。)

所以我的问题是我如何需要 2 个水龙头?换句话说,如果 label_1 和 label_2 都显示为字符串“A”,我将如何要求用户点击 buttonA 两次?如果需要更多代码,请在 cmets 中告诉我。

    @IBOutlet weak var label_1: UILabel!
    @IBOutlet weak var label_2: UILabel!
    @IBOutlet weak var label_3: UILabel!
    @IBOutlet weak var label_4: UILabel!
    @IBOutlet weak var label_5: UILabel!


    var visibleLetters = ["A", "B", "Z", "X"]
    var text = "", text2 = "", text3 = "", text4 = "", text5 = ""
    let aButton = "A", bButton = "B", zButton = "Z", xButton = "X"
    var x = 0


    override func viewDidLoad() 
        super.viewDidLoad()

        createRandomLetter(text, aSecondLetter: text2, aThirdLetter: text3, aFourthLetter: text4, aFifthLetter: text5)

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func buttonA(sender: UIButton) 

        if aButton == label_1.text 
            label_1.hidden = true
            label_1.tag += 1
        

        else 
            //play animation
            print("play animation")
        
    

    @IBAction func buttonB(sender: UIButton) 
        if bButton == label_1.text 
            label_1.hidden = true
        
    

    @IBAction func buttonX(sender: UIButton) 
        if xButton == label_1.text 
            label_1.hidden = true
        
    

    @IBAction func buttonZ(sender: UIButton) 
        if zButton == label_1.text 
            label_1.hidden = true
        
    



    func createRandomLetter(individualLetter: String, aSecondLetter: String, aThirdLetter: String, aFourthLetter: String, aFifthLetter: String) 

        let individuaLetter = visibleLetters[Int(arc4random_uniform(UInt32(visibleLetters.count)))],
        aSecondLetter = visibleLetters[Int(arc4random_uniform(UInt32(visibleLetters.count)))],
        aThirdLetter = visibleLetters[Int(arc4random_uniform(UInt32(visibleLetters.count)))],
        aFourthLetter = visibleLetters[Int(arc4random_uniform(UInt32(visibleLetters.count)))],
        aFifthLetter = visibleLetters[Int(arc4random_uniform(UInt32(visibleLetters.count)))]

        label_1.text = individuaLetter
        label_2.text = aSecondLetter
        label_3.text = aThirdLetter
        label_4.text = aFourthLetter
        label_5.text = aFifthLetter
    

    func isCorrect() 

        if aButton == label_1.text 
            label_1.hidden = true
            label_1.tag += 1
        

        else if label_1.tag == 1 && aButton == label_2.text 

        
        else 
            //play animation
            print("play animation")
        
    

【问题讨论】:

我不确定你想做什么。能详细点吗? label1 是否绑定到 buttonA 而 label2 绑定到 buttonB?你能解释一下点击两次的必要性吗? 我会尽力解释我想要什么。我有一组随机的字母和一组不变的按钮。按钮总是 A、B、X、Z(我很遗憾这么快就添加了额外的按钮),所以我要假装我没有添加 X 和 Z。所以我有 2 个随机显示 A 或 B 的标签. 如果 label_1 显示 A,用户必须按 A,如果 label_1 显示 B,则用户必须按 A。如果用户按下正确的按钮,那么他对 label_2 执行相同操作。 @ryantxr 也许多次点击具有误导性。我要检查的是相应的按钮和标签是否匹配。例如,buttonA 和 label_1,基本上用 label_2 重复按钮 A 或 B 的过程... 【参考方案1】:

好吧,试着弄清楚你想要做什么让我们举个例子。因此,您有 4 个标签和 2 个按钮(A,B),当您单击按钮时,标签具有随机生成的 A,B 值,您需要检查该按钮是否具有与标签相同的文本,如果正确,我们如果不正确,请对 label2 执行相同操作,我们会继续尝试。

执行此操作的一种合乎逻辑的方法是将标签与您的标签相关联(我认为您已经这样做了)并有一个时间变量来跟踪当前标签,例如

  var temporal:String!
  var current_tag:Int = 1
  override func viewDidLoad() 
    super.viewDidLoad()

    createRandomLetter(text, aSecondLetter: text2,
    aThirdLetter: text3, aFourthLetter: text4, aFifthLetter: text5)
     temporal = label1.text



  @IBAction func buttonZ(sender: UIButton) 
    //Answer is correct 
    if zButton == temporal 
        current_tag++
        IsCorrect(current_tag)
    


func Iscorrect(tag:Int)


   if(label2.tag == tag)
   
        temporal = label2.text
   
   else if(label3.tag == tag)
   
        temporal = label2.text
   
   else if(label4.tag == tag)
   
        temporal = label2.text
   

这样的东西应该可以工作,我没有尝试过,因为我是从我的 Ipad 上回答的,而且我无法使用我的笔记本电脑,但是这样的东西应该完全可以工作,任何疑问我都可以帮助你 XD

【讨论】:

是的!这正是我想要做的!现在我试图理解它为什么起作用。此外,我收到此错误:致命错误:在展开可选值时意外发现 nil。我想我收到错误是因为 label2.tag 与 current_tag 不匹配,但它们似乎匹配,所以我试图弄清楚为什么 temporal 没有值。 当我们尝试比较尚未分配的变量时,一定会发生错误,这就是为什么在视图 didload 方法中我初始化了 temporal 尝试在之前初始化为类似 var temporal:String = ""我会在几个小时后在家尝试一下,如果答案帮助您将其标记为正确XD 我错过了您在 viewDidLoad 中分配的变量。在研究了一段时间之后,我想我对正在发生的事情有了基本的了解。感谢您的帮助。 有任何疑问,我们在这里寻求帮助 XD

以上是关于如何在 Swift 中使用 UIKit 注册多个按钮点击?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UIKit 在 Swift 5 中立即强制更新我的 UI?

如何使用 iOS Swift SKOverlay 和 UIKit 来交叉推广另一个应用程序?

如何在没有任何第三方库的情况下使用 UIKit 在 iOS 应用程序中使用 Swift 5 中的 GIF?

Swift:将 SwiftUI 元素添加到 UIKit 项目:无法正确应用约束

如何使用 UIKit 在 Swift 5 中创建具有内在高度的 UITableView?

SWIFT / UIKit 页脚文本显示在动态 tableViewCell 上