Swift:如何每秒随机更改背景颜色?

3
我的代码如下,每次打开应用程序都会从我的颜色数组中随机选择一个背景颜色,但不会每秒钟更改一次颜色。我在这里做错了什么?
import UIKit

class ViewController: UIViewController {

var timer = NSTimer()

func randomColorGenerator() -> Int{
    let randomColor = Int(arc4random_uniform(4))
    return randomColor
}

override func viewDidLoad() {
    super.viewDidLoad()
    let colors = [
        UIColor(red: 233/255, green: 203/255, blue: 198/255, alpha: 1),
        UIColor(red: 38/255, green: 188/255, blue: 192/255, alpha: 1),
        UIColor(red: 253/255, green: 221/255, blue: 164/255, alpha: 1),
        UIColor(red: 235/255, green: 154/255, blue: 171/255, alpha: 1),
        UIColor(red: 87/255, green: 141/255, blue: 155/255, alpha: 1)
    ]

     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("randomColorGenerator"), userInfo: nil, repeats: true)

    let randColor = ViewController().randomColorGenerator()
    self.view.backgroundColor = colors[randColor]
}

随机颜色生成器方法是否也将颜色应用于屏幕上? - ZeMoon
randomColorGenerator 返回一个随机数字,该数字然后被用来将 randColor 设置为该随机数字,进而在“self.view.backgroundColor = colors[randColor]”中使用。我应该在 randomColorGenerator 方法内包含更改背景颜色的语句吗? - D.Khan
1
从你的代码中我能看到,你的计时器只是调用了 randomColorGenerator 方法并返回一个 Int,然后什么也没有发生。 - Eendje
根据您设置代码的方式,您的函数不能生成更多的随机数,因为它的作用域在viewDidLoad结束时就结束了。 - WhiteTiger
@D.Khan 这就是问题所在,你只是生成了一个随机数,而没有使用计时器来设置屏幕。 - ZeMoon
2个回答

4
尝试使用这段代码:
import UIKit

class ViewController: UIViewController {
    var timer: NSTimer!

    func setRandomBackgroundColor() {
        let colors = [
            UIColor(red: 233/255, green: 203/255, blue: 198/255, alpha: 1),
            UIColor(red: 38/255, green: 188/255, blue: 192/255, alpha: 1),
            UIColor(red: 253/255, green: 221/255, blue: 164/255, alpha: 1),
            UIColor(red: 235/255, green: 154/255, blue: 171/255, alpha: 1),
            UIColor(red: 87/255, green: 141/255, blue: 155/255, alpha: 1)
        ]
        let randomColor = Int(arc4random_uniform(UInt32 (colors.count)))
        self.view.backgroundColor = colors[randomColor]
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("setRandomBackgroundColor"), userInfo: nil, repeats: true)
        self.setRandomBackgroundColor()
    }
}

我所做的更改:我将你的randomColorGenerator函数重命名为setRandomBackgroundColor。然后,我使这个函数真正地改变颜色,而不仅仅是计算并返回一些随机索引。
其他一些小改动:let randomColor = Int(arc4random_uniform(4)),你可以使用UInt32(colors.count)代替硬编码常量4var timer = NSTimer() - 你不需要初始化这个定时器,因为你后面没有使用这个初始值。只需要声明变量类型:var time: NSTimer! 在你最初的示例中,你每秒钟计算一个随机索引,但是你没有使用它来实际设置背景颜色。

1
你的回答中有错别字:colors[randColor] 应该是 colors[randomColor] - Eendje
即使我将其更改为“colors [randomColor]”,在“let randomColor = Int(arc4random_uniform(colors.count))”行上仍会出现错误,指出无法将类型“Int”的值转换为预期的参数类型UInt32。 - D.Khan
1
另外,我会在 viewDidLoad 中将颜色添加到数组中,而不是每次调用该方法时都创建一个新的数组。 - Eendje
@Eendje,是的,说得好,你可以将 let colors = [...] 声明为实例变量(在 var timer: NSTimer! 行下面声明它)。 - glyuck
@D.Khan 抱歉,我是在浏览器中编写这段代码的,还没有在 playground 中进行过测试。你能再试一次吗? - glyuck

1

@glyuck答案2019更新:

 override func viewDidLoad() {
    super.viewDidLoad()

    timer = Timer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self.setRandomBackgroundColor), userInfo: nil, repeats: true)
    self.setRandomBackgroundColor()
}

NSTimer是计时器。 - BorisD
1
如果您有足够的声望,应该提出修改建议而不是发布重复答案,提供没有额外信息的答案,并将一个三年前的问题推到首页。 - Claus Jørgensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接