I have a function that generates the random color. Every time I call the function, it generates the same color. I put the function in viewDidLoad() but it still generates the same color.
Accepted Reply
`viewDidLoad()` would not be called when your view contoller is shown. As the view controller uses the already loaded view.
Please try moving the random color setting code from `viewDidLoad()` to `viewWillApeear(_:)`.
In some cases, `viewWillApeear(_:)` would not be called neither, so please tell me more details if you cannot make it with `viewWillApeear(_:)`.
Replies
Please show your current code.
func generateRandomColor() -> UIColor {
let redValue = CGFloat(drand48())
let greenValue = CGFloat(drand48())
let blueValue = CGFloat(drand48())
let randomColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
return randomColor
}
override func viewDidLoad() {
super.viewDidLoad()
if mainPhoto.backgroundColor == nil {
mainPhoto.backgroundColor = generateRandomColor()
}
else {
mainPhoto.backgroundColor = generateRandomColor()
}
}
I am trying to change the background color of an image every time the view loads. Even if I close the app and re-open it, it still generates the same color. Why is that?
Some random library uses exactly the same initial settings at each time the process is initialized.
And `drand48()` is definitely one of them.
So,
if I close the app and re-open it, it still generates the same color. Why is that?
That is the expected behavior with your code.
Why are you using such outdated old C library function?
Try something like this:
func generateRandomColor() -> UIColor {
let redValue = CGFloat.random(in: 0...1)
let greenValue = CGFloat.random(in: 0...1)
let blueValue = CGFloat.random(in: 0...1)
let randomColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
return randomColor
}
The method `randome(in:)` uses better algorithm and random seed for initial value, which is something you expect.
---
By the way what do you intend with this?
if mainPhoto.backgroundColor == nil {
mainPhoto.backgroundColor = generateRandomColor()
}
else {
mainPhoto.backgroundColor = generateRandomColor()
}
The if-statement has no meaning here... Some sort of not-implemented-yet feature?
When I googled how to generate a random color the drand library function came up so I used it. Yes, the random(in: 0...1) function works better but there is one other thing that I need help with. When I tap the back button in the navigation controller, a new custom color isn't generated. Does the view not load when I tap the back button? How can I get it to generate a new random color when I tap the back button?
`viewDidLoad()` would not be called when your view contoller is shown. As the view controller uses the already loaded view.
Please try moving the random color setting code from `viewDidLoad()` to `viewWillApeear(_:)`.
In some cases, `viewWillApeear(_:)` would not be called neither, so please tell me more details if you cannot make it with `viewWillApeear(_:)`.
Yes, viewWillAppear() worked. Thank you.
you just repeat what OOPer explained 1 year ago…
You'd better read the answers, not only the initial question.
Have a good day.