2016-08-28 7 views
0

Я хочу запустить таймер внутри цикла только для заданного числа петель. Существует также внешний цикл.Таймер в цикле for в Swift

пользователь будет вводить количество повторений, которые он хочет, сколько процентов в каждом повторении, промежуток времени между двумя отсчетами.

приложение покажет подсчеты каждого повторения. Когда все повторения будут выполнены, приложение остановит таймер.

Но мне сложно. Похоже, что таймер игнорирует цикл for и представляет собой цикл сам по себе, который останавливается, когда мы выдаем timer.invalidate().

Любые мысли об этом?

for x in 0...HowManyRepetitions { 

       counter = 0 
       CountLabel.text = "\(counter)" 
       RepetitionLabel.text = "\(x)/\(HowManyRepetitions)" 

       for y in 0...HowManyCounts { 

        timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: updateCounter, userInfo: nil, repeats: true) 

       } 

      } 
+0

Ваш таймер не делает ничего, так как он имеет ноль селектор. Почему у вас есть таймер? – Paulw11

ответ

1

Счет повторения должен управляться обработчиком таймера.

Обычно вы сохраняете таймер как свойство экземпляра. (Вы, возможно, потребуется аннулировать таймер, например, когда viewWillDisappear(_:).)

Таким образом, вам может понадобиться, чтобы написать что-то подобное в своем классе:

var timer: NSTimer? 
func startTimer(howManyCounts: Int, periodBetween: NSTimeInterval) { 
    let userInfo: NSMutableDictionary = [ 
     "counter": 0, 
     "howManyCounts": howManyCounts, 
     "myName": "Timer" 
    ] 
    self.timer = NSTimer.scheduledTimerWithTimeInterval(periodBetween, target: self, selector: #selector(timerHandler), userInfo: userInfo, repeats: true) 
} 

@objc func timerHandler(timer: NSTimer) { 
    guard let info = timer.userInfo as? NSMutableDictionary else { 
     return 
    } 
    var counter = info["counter"] as? Int ?? 0 
    let howManyCounts = info["howManyCounts"] as? Int ?? 0 
    let myName = info["myName"] as? String ?? "Timer" 
    counter += 1 

    print("\(myName):\(counter)") //countLabel.text = "\(counter)" 

    if counter >= howManyCounts { 
     timer.invalidate() 
    } else { 
     info["counter"] = counter 
    } 
} 

Запустить таймер где-то в методе тот же класс, как:

startTimer(10, periodBetween: 3.0) 

Я не понимаю, почему вам нужен внешний цикл, но если вы хотите сделать несколько таймеров работает, вы должны держать все таймеры.

var timers: [NSTimer] = [] 
func startTimers(howManyRepetitions: Int, howManyCounts: Int, periodBetween: NSTimeInterval) { 
    timers = [] 
    for x in 1...howManyRepetitions { 
     let userInfo: NSMutableDictionary = [ 
      "counter": 0, 
      "howManyCounts": howManyCounts, 
      "myName": "Timer-\(x)" 
     ] 
     timers.append(NSTimer.scheduledTimerWithTimeInterval(periodBetween, target: self, selector: #selector(timerHandler), userInfo: userInfo, repeats: true)) 
    } 
} 

Запуск таймера как:

startTimers(3, howManyCounts: 4, periodBetween: 1.0) 
1

Я думаю, что ваш таймер должен выйти из строя.

, например:

for x in 0...HowManyRepetitions { 

       counter = 0 
       CountLabel.text = "\(counter)" 
       RepetitionLabel.text = "\(x)/\(HowManyRepetitions)" 

       timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: nil, userInfo: nil, repeats: true) 

       for y in 0...HowManyCounts { 
        // doSomething 
        ... 
       } 

       timer.invalidate() 

      } 
0

Не зная точно, что вы просите, вы можете установить в цикле. Более подробная информация наверняка поможет.

let param = 0 //IN SCOPE 

for y in 0...HowManyCounts { 

    param++ 

    if param != HowManyCounts{ 
    timer = NSTimer.scheduledTimerWithTimeInterval(PeriodBetween, target: self, selector: nil, userInfo: nil, repeats: true) 
    }else{ 
     timer.invalidate() 
    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^