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.
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.
Your label isn't wide enough for longer values. Call sizeToFit()
on the label after updating the text.
targetLabel.text = String(targetVal)
targetLabel.sizeToFit()