在swift中为for循环添加延迟

时间:2016-09-30 08:46:59

标签: ios for-loop delay nstimer swift3

我有编码问题'。

我有一个标签,我希望每2秒动态更改一次文本。 我做了以下事情:

// WELCOME STRING ARRAY
let welcomeContainer:[String] = ["Welcome","Benvenuti","Bienvenue","Willkommen","üdvözlet","Dobrodošli","добро пожаловать","Witajcie","Bienvenido","Ласкаво просимо","Vitajte","欢迎你来"]

然后,我没有使用timerwithinterval(这对于这个简单的任务来说似乎太多了),我尝试在我的函数delay循环中使用for方法循环:< / p>

func welcomeLabelChange() {
for i in 0..<welcomeContainer.count {
    welcomeLabel.text = welcomeContainer[i]
    delay(delay: 2.0, closure: {})
}

不幸的是,它完全跳过延迟... for循环立即执行,只显示数组中的最后一个文本。 我做错了什么?

我发现了这个OBJ-C answer,但它提出了(旧的)NSTimer实施。

6 个答案:

答案 0 :(得分:15)

您也可以使用此功能延迟某些内容

//MARK: Delay func 

func delay(_ delay:Double, closure:@escaping ()->()) {
    DispatchQueue.main.asyncAfter(
        deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

用法是:

        delay(2)  //Here you put time you want to delay
{
            //your delayed code
        }

希望它会对你有所帮助。

答案 1 :(得分:4)

定义那些变量

var i = 0
let timer : Timer?

将此计时器放入您的视图中加载或您想要开始标签更改的位置

   timer =  Timer.scheduledTimer(timeInterval: 2.0, target: self, selector:#selector(YourViewController.changeText), userInfo: nil, repeats: true)

并实现此方法:

func changeText(){
    if i>=welcomeContainer.count {
        i = 0
    }

    welcomeLabel.text = welcomeContainer[i]
    i += 1
}

当你想要停止它或更改视图控制器时别忘了调用

timer.invalidate()

答案 2 :(得分:0)

使用Timer时,您应该小心拨打invalidateTimer的{​​{1}},否则您可能无法释放视图控制器。

或者,您可以使用GCD调度计时器,使用viewDidDisappear模式完全消除强参考周期:

[weak self]

答案 3 :(得分:0)

标记的答案不会延迟循环迭代,你仍然只得到label.text中的最后一个值。

你可以这样解决:

Object.equals

用法:

func showWelcome(_ iteration: Int = 0) {
    let i = iteration>=self.welcomeContainer.count ? 0 : iteration
    let message = self.welcomeContainer[i]
    self.delay(2){
        self.welcomeLabel.text = message
        return self.showWelcome(i + 1)
    }
}

答案 4 :(得分:0)

您可以添加睡眠功能

for i in 0..<welcomeContainer.count {
    welcomeLabel.text = welcomeContainer[i]
    sleep(2) // or sleep(UInt32(0.5)) if you need Double
}

答案 5 :(得分:0)

如果要使其全部保持内联,则可以执行以下操作:

and