Search code examples
iosswiftuikit

Swift result of arc4random_uniform is not always displayed in label


I've started learning Swift recently and walking through a tutorial. The idea is to create a BullEye game. I have encountered a problem with displaying a randomly-generated value.

This bug appears randomly. Sometimes I have series of normally displayed values, sometimes series of "..." instead of values.

Value is not displayed

Here is my code:

import UIKit

class ViewController: UIViewController {
    var currentValue = 0
    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var targetLabel: UILabel!
    @IBOutlet weak var scoreLabel: UILabel!
    @IBOutlet weak var roundLabel: UILabel!
    var targetVal = 0
    var score = 0
    var round = 1

    override func viewDidLoad() {
        super.viewDidLoad()

        currentValue = lroundf(slider.value)
        startRound()
    }

    @IBAction func sliderMoved(_ slider: UISlider){
        print("The value is now: \(slider.value)")
        currentValue = lroundf(slider.value)
    }

    @IBAction func showAlert(){
        let diff = abs(targetVal-currentValue)
        let points = 100 - diff

        score += points
        round += 1

        let message = "You scored \(points)"

        let alert = UIAlertController(title: "Hello, world!", message: message, preferredStyle: .alert)

        let action = UIAlertAction(title: "Awesome", style: .default, handler: nil)

        alert.addAction(action)

        present(alert, animated: true, completion: nil)

        startRound()
    }

    func startRound(){
        updateLabels()
        targetVal = 1 + Int(arc4random_uniform(100))
        currentValue = 50
        slider.value = Float(currentValue)
    }

    func updateLabels(){
        targetLabel.text = String(targetVal)
        scoreLabel.text = String(score)
        roundLabel.text = String(round)
    }
}

Moving updateLabels() inside startRound() doesn't make any difference. At first round value is always displayed.


Solution

  • Your label isn't wide enough for longer values. Call sizeToFit() on the label after updating the text.

    targetLabel.text = String(targetVal)
    targetLabel.sizeToFit()