按钮功能在按下时无法正确处理事件?

Button function not handling the event properly when pressed?

struct Question {
    var Question : String!
    var Answers : [String]!
    var AnswerNumber : Int!
}

class LevelOne: SKScene {
    
    var button = Button()
    
    var buttons = [Button]()
    let Question_met = UILabel(frame: CGRect(x: 0.3, y: 0.3, width: 40, height: 21))
    
    var Questions = [Question]()
    
    var QNumber = Int()
    
    var buttonNames = [""]
    
    var AnsNumber = Int()
    
    let selectors:[Selector] = [#selector(handleButton1), #selector(handleButton2), #selector(handleButton3),#selector(handleButton4)]
    
    override func didMove(to view: SKView) {
        
        let background = SKSpriteNode(imageNamed: "background")
        background.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
        background.zPosition = 0
        self.addChild(background)
        
        QuestionFunction()
        
        ButtonFuction()
         
        PickQuestion()
        
    }
    
    @objc func QuestionFunction(){
        
        Questions = [Question(Question: "What is a BMW ?", Answers: ["Bat","Cat","Vehicle","Pat"], AnswerNumber: 2),
        Question(Question: "What is a Boeing ?", Answers: ["Bat","Aircraft","Cat","Pat"], AnswerNumber: 1),
        Question(Question: "What is a Ant ?", Answers: ["Insect","Cat","Insect","Nate"], AnswerNumber: 2),
        Question(Question: "What is a Apple ?", Answers: ["Fruit","Cat","bat","Pat"], AnswerNumber: 0),
        Question(Question: "Where is london ?", Answers: ["UK","USA","France","Germany"], AnswerNumber: 0),
        Question(Question: "Where is New York ?", Answers: ["Canada","USA","France","Germany"], AnswerNumber: 2),
        Question(Question: "where is Berlin ?", Answers: ["UK","USA","Italy","Germany "], AnswerNumber: 3),
        Question(Question: "Where is Toronto ?", Answers: ["India","Africa","Canada","Norway"], AnswerNumber: 2),
        Question(Question: "Where is Rome ?", Answers: ["Japan","China","Italy","Ireland"], AnswerNumber: 2),
        Question(Question: "where is Chennai ?", Answers: ["India","Brazil","Swiss","Germany"], AnswerNumber: 0),]
        
        Question_met.frame = CGRect(x: 330, y: 70, width: 200, height: 21)
        Question_met.backgroundColor = UIColor.orange
        Question_met.textColor = UIColor.white
        Question_met.textAlignment = NSTextAlignment.center
        Question_met.text = "What caused Global Warming ?"
        self.view?.addSubview(Question_met)
        
    }
    
    @objc func ButtonFuction(){
        
        let stacView = UIStackView()
        stacView.spacing = 12
        stacView.distribution = .fillEqually
        stacView.axis = .horizontal
        stacView.translatesAutoresizingMaskIntoConstraints = false
        view!.addSubview(stacView)
        
        buttonNames = ["One","Two","Three","Four"]
        
        for name in buttonNames {
            button = Button()
            button.setTitle(name, for: .normal)
            stacView.addArrangedSubview(button)
            buttons.append(button)
        }
        
        for i in 0..<4{
            
            button.addTarget(self, action: selectors[i], for: .touchUpInside)
            
        }
    
        NSLayoutConstraint.activate([stacView.centerXAnchor.constraint(equalTo: view!.centerXAnchor),stacView.centerYAnchor.constraint(equalTo: view!.centerYAnchor),stacView.widthAnchor.constraint(equalToConstant: 350),stacView.heightAnchor.constraint(equalToConstant:70)])
        
    }
    
    @objc func PickQuestion(){
        
        if Questions.count > 0{
            QNumber = 0
            Question_met.text = Questions[QNumber].Question
            
            AnsNumber = Questions[QNumber].AnswerNumber
            
            for i in 0..<buttons.count{
                buttons[i].setTitle(Questions[QNumber].Answers[i], for: .normal)
            }
            Questions.remove(at: QNumber)
        }
        else {
            print("Done!")
        }
    }
    
    @objc func handleButton1() {
        
        if AnsNumber == 0 {
            PickQuestion()
            print("Correct!")
        }
        
        else {
            print("You are Wrong!!!")
        }
    }
    
    @objc func handleButton2(){
        
        if AnsNumber == 1 {
            PickQuestion()
            print("Correct!")
        }
        
        else {
            print("You are Wrong!!!")
        }
        
    }
    
    @objc func handleButton3(){
        
        if AnsNumber == 2 {
            PickQuestion()
            print("Correct!")
        }
        
        else {
            print("You are Wrong!!!")
            
        }
        
    }
    
    @objc func handleButton4(){
        
        if AnsNumber == 3 {
            PickQuestion()
            print("Correct!")
        }
        
        else {
            print("You are Wrong!!!")
        }
        
    }
}

按钮操作方法似乎无法准确知道按下了哪个正确答案按钮,同时为每个问题分配了不同的数字作为答案,方法似乎只有在按下最后一个按钮时才会向前移动。

提前感谢您的帮助。

您的问题位于您的 ButtonFunction():

for name in buttonNames {
    button = Button()
    button.setTitle(name, for: .normal)
    stacView.addArrangedSubview(button)
    buttons.append(button)
}

for i in 0..<4{
    
    button.addTarget(self, action: selectors[i], for: .touchUpInside)
    
}

在第二个循环中,您没有初始化 button 变量,因此这始终是第四个按钮.. 最好只在一个循环中加入此代码,如下所示:

for i in 0..<4{
    button = Button()
    button.setTitle(buttonNames[i], for: .normal)
    stacView.addArrangedSubview(button)
    buttons.append(button)
    button.addTarget(self, action: selectors[i], for: .touchUpInside)
}

除此解决方案外,还有一些对您的编码风格的建议:

  • 为了方便和更好的可读性,函数名和变量名应该以小写字母开头
  • 在尽可能小的范围内声明变量。
    • buttonbuttonNamesselectors 仅在 ButtonFunction() 中使用,因此应在此处声明。
    • button 的声明实际上应该只在 for 循环中。这样,编译器会告诉你,button 在你的第二个循环中是未知的,你会自己看到问题;)