在swift中为for循环添加延迟

Ale*_*lex 5 for-loop delay nstimer ios swift3

我有一个编码'问题'.

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

// WELCOME STRING ARRAY
let welcomeContainer:[String] = ["Welcome","Benvenuti","Bienvenue","Willkommen","üdvözlet","Dobrodošli","????? ??????????","Witajcie","Bienvenido","??????? ???????","Vitajte","????"]
Run Code Online (Sandbox Code Playgroud)

然后,timerwithinterval我尝试使用delay我的函数内部for循环中的方法,而不是使用(这对于这个简单的任务来说似乎太多了):

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

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

我找到了这个OBJ-C的答案,但它暗示了一个(旧的)NSTimer实现.

0nd*_*re_ 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)
}
Run Code Online (Sandbox Code Playgroud)

用法是:

        delay(2)  //Here you put time you want to delay
{
            //your delayed code
        }
Run Code Online (Sandbox Code Playgroud)

希望它会对你有所帮助.

  • 这不起作用。循环中的所有项目将被立即调用(但延迟 2 秒后)。 (6认同)

ben*_*ben 5

定义那些变量

var i = 0
let timer : Timer?
Run Code Online (Sandbox Code Playgroud)

将此计时器放置在您的视图中是否已加载或您希望开始更改标签的位置

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

并实现此方法:

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

    welcomeLabel.text = welcomeContainer[i]
    i += 1
}
Run Code Online (Sandbox Code Playgroud)

当您想停止它或更改视图控制器时,不要忘记调用

timer.invalidate()
Run Code Online (Sandbox Code Playgroud)


Boo*_*rin 5

可以添加睡眠功能

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