【问题标题】:Swift: How can I change the background color randomly every second?斯威夫特:如何每秒随机更改背景颜色?
【发布时间】:2016-06-01 23:25:27
【问题描述】:

每次我打开应用程序时,我下面的代码都会从我的颜色数组中给我一个随机的背景颜色,但不会每秒都改变颜色。我在这里做错了什么?

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]
}

【问题讨论】:

  • randomColorGenerator 方法是否也将颜色应用于屏幕?
  • randomColorGenerator 返回一个随机数,然后将 randColor 设置为随机数,然后在“self.view.backgroundColor = colors[randColor]”中使用。我应该在 randomColorGenerator 方法中包含更改背景颜色语句吗?
  • 我从你的代码中可以看出,你的计时器只是调用randomColorGenerator,它返回一个Int,然后什么都没有发生。
  • 关于你如何设置你的函数只能随机生成的代码,因为它的范围在 viewDidLoad 结束时结束
  • @D.Khan 这就是问题所在,你只是在生成一个随机数,而不是使用计时器设置屏幕。

标签: ios arrays swift random nstimer


【解决方案1】:

试试这个代码:

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) 代替硬编码常量4

var timer = NSTimer() - 你不需要初始化这个计时器,你以后不会使用这个初始值。只声明变量类型就足够了:var time: NSTimer!

在您的初始示例中,您每秒都在计算随机索引,但您并没有使用它来实际设置背景颜色。

【讨论】:

  • 您的答案中的错字:colors[randColor] 应该是 colors[randomColor]
  • 即使我将其更改为“colors[randomColor]”,也会出现错误:“let randomColor = Int(arc4random_uniform(colors.count))”行说无法转换类型的值“ Int" 到预期的参数类型 UInt32
  • 另外,我会将颜色添加到viewDidLoad 中的数组中,而不是每次调用该方法时都创建一个新颜色。
  • @Eendje,是的,很好,您可以将let colors = [...] 设为实例变量(在var timer: NSTimer! 行下方声明它)。
  • @D.Khan 对不起,我已经在浏览器中编写了这段代码,还没有在操场上检查它。可以再试一次吗?
【解决方案2】:

@glyuck 回答 2019 年更新:

 override func viewDidLoad() {
    super.viewDidLoad()

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

【讨论】:

  • 和 NSTimer 是定时器
  • 您应该提出修改建议(如果您有足够的代表),而不是发布一个没有附加信息的重复答案,并且只是将一个 3 年前的问题放到首页。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2021-06-18
相关资源
最近更新 更多