【问题标题】:Changing label.text after button click单击按钮后更改 label.text
【发布时间】:2017-04-05 13:51:45
【问题描述】:

我想做一个数学测验应用。当程序加载时,标签设置为第一个问题,该问题是随机创建的,不使用数组来保存问题。

正确答案和“假答案”已正确分配给 4 个按钮,我现在要做的是单击其中一个按钮时,我想检查按钮当前标题是否与正确的相同回答,然后继续生成新的问题和答案。

这是我编写的代码,我认为它会做我想做的事,但事实并非如此。

 @IBAction func button1Press(_ sender: Any) {
    if button1.currentTitle == ("\(answer)")
    {
        rightAnswerCount = rightAnswerCount + 1
        generateQuestion()
        generateAnswer()
        displayButtonValues()
    }
    else {
        wrongAnswerCount = wrongAnswerCount + 1
        generateQuestion()
        generateAnswer()
        displayButtonValues()
    }
}

我可以对此代码进行哪些改进以使其正常工作?

谢谢!


添加自 OP 的评论

要分配按钮标题,我这样做;

if buttonNo == 4 { 
    button4.setTitle("(answer)", for: .normal) 
} else { 
    button4.setTitle("(answer + 5)", for: .normal) 

}

其他功能;

func generateQuestion(){
    switch symbolNo {
    case 1:
        operatorSymbol = "+"
        self.lbl.text = "\(firstNo) + \(secondNo) = ?"
        question = "\(firstNo) + \(secondNo) = ?"
    case 2 :
        operatorSymbol = "-"
        self.lbl.text = "\(firstNo) - \(secondNo) = ?"
        question = "\(firstNo) - \(secondNo) = ?"
    case 3 :
        operatorSymbol = "/"
        self.lbl.text = "\(firstNo) / \(secondNo) = ?"
        question = "\(firstNo) / \(secondNo) = ?"
    case 4 :
        operatorSymbol = "x"
        self.lbl.text = "\(firstNo) x \(secondNo) = ?"
        question = "\(firstNo) x \(secondNo) = ?"

    default:
        self.lbl.text = ""
    }
}

func generateAnswer(){
    switch symbolNo {
    case 1:
        answer = firstNo + secondNo
    case 2:
        answer = firstNo - secondNo
    case 3:
        answer = firstNo / secondNo
    case 4:
        answer = firstNo * secondNo
    default:
        answer = 0
    }
}

func displayButtonValues(){
    if buttonNo == 1 {
        button1.setTitle("\(answer)", for: .normal)
    }
    else {
        button1.setTitle("\(answer - 4)", for: .normal)
        }
    if buttonNo == 2 {
        button2.setTitle("\(answer)", for: .normal)
    }
    else {
        button2.setTitle("\(answer - 2)", for: .normal)
        }
    if buttonNo == 3 {
        button3.setTitle("\(answer)", for: .normal)
    }
    else {
        button3.setTitle("\(answer + 3)", for: .normal)
        }
    if buttonNo == 4 {
        button4.setTitle("\(answer)", for: .normal)
    }
    else {
        button4.setTitle("\(answer + 5)", for: .normal)
        }

    }

我这里也有这3个函数,所以当应用第一次加载时,这些函数会立即执行;

override func viewDidLoad() {
    super.viewDidLoad()
    generateQuestion()
    generateAnswer()
    displayButtonValues()

    // Do any additional setup after loading the view, typically from a nib.
}

变量

let firstNo = Int(arc4random_uniform(10)+1)
let secondNo = Int(arc4random_uniform(10)+1)
let symbolNo = Int(arc4random_uniform(4)+1)
let buttonNo = Int(arc4random_uniform(4)+1)
var operatorSymbol = ""
var answer = Int()
var question = ""
var rightAnswerCount = 0
var wrongAnswerCount = 0

【问题讨论】:

  • 当前代码有什么问题?不编译?崩溃?没有按预期工作?
  • 代码没有按预期工作,按下按钮时调用的函数没有被调用,我不确定为什么..它编译完美,不会崩溃。
  • 如何分配按钮上的标题?
  • 我可以给小费。让我们使用 sender 参数。这样,所有按钮按下都可以订阅此 1 功能。 (即。sender.currentTitle == ...)对于执行相同操作的 4 个按钮,拥有 4 个相同的功能是没有用的。也可以将(_ sender: Any) 做成(_ sender: UIButton)
  • @Shen 我将“let”更改为“var”,并创建了一个新函数,它随机化所有这些变量并使其正常工作!

标签: swift xcode


【解决方案1】:

也许你应该这样比较你的按钮:

if button1.titleLabel?.text==answer{
    print("good answer")
    rightAnswerCount += 1
}else{
    print("bad answer")
    wrongAnswerCount += 1
}
generateQuestion()
generateAnswer()
displayButtonValues()

【讨论】:

  • currentTitle 应该可以正常工作并且(作为 get-only 属性)可能是正确的使用方法。
  • 这只会在单击按钮后显示答案是正确还是不正确,我希望生成下一个问题并将其分配给标签,然后生成答案并将其分配给按钮是通过使用我上面代码中列出的那些函数来完成的,这就是为什么我很困惑,因为它不起作用
  • 对不起,我误会了。我不明白什么不起作用或您的问题是什么。
  • 查看我最初显示的代码,当按下按钮时,如果 button.currentTitle == answer 那么应该调用函数。如果 button.currentTitle 不等于 answer,则仍应调用该函数以生成新问题、答案,然后显示按钮值。
  • 在两种情况下都打印一些东西(好的或错误的答案),看看是否触发了正确的操作。
【解决方案2】:

问题就在这里:

let firstNo = Int(arc4random_uniform(10)+1)
let secondNo = Int(arc4random_uniform(10)+1)
let symbolNo = Int(arc4random_uniform(4)+1)
let buttonNo = Int(arc4random_uniform(4)+1)

在生成每个问题之前,需要将这些常量更改为var 并分配一个新值。这解释了为什么它第一次工作,但之后看不到任何变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2018-08-01
    • 2016-02-29
    相关资源
    最近更新 更多