2016-11-23 4 views
0

Я пытаюсь обновить таймер обратного отсчета в части сообщения UIAlertController. Я пробовал множество ответов, предложенных здесь, но без радости. У меня есть простой ViewController, чтобы попробовать, чего я пытаюсь достичь.Проблемы с обновлением таймера обратного отсчета в UIAlertController

class ViewController: UIViewController { 

var counter:Int = 5 
var timer: NSTimer? 
var label = "" 
var message = "in " 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewDidAppear(animated: Bool) { 
    showAlert() 
} 

func showAlert(){ 
    let alertController = UIAlertController(title: "Try again ", message: countDownString(), preferredStyle: .Alert) 

    presentViewController(alertController, animated: true){ 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self.decrease), userInfo: nil, repeats: true) 
    } 
} 

func decrease() 
{ 
    var minutes: Int 
    var seconds: Int 
    if(counter > 0) { 
     self.counter -= 1 
     print(counter) // Correct value in console 
     minutes = (counter % 3600)/60 
     seconds = (counter % 3600) % 60 
     label = String(format: "%02d:%02d", minutes, seconds) 
     print(label) // Correct value in console 
    } 
    else{ 
     dismissViewControllerAnimated(true, completion: nil) 
     timer!.invalidate() 
    } 
} 

func alertMessage() -> String { 
    print(message+"\(self.label)") 
    return(message+"\(self.label)") 
} 

func countDownString() -> String { 
    print("\(counter) seconds") 
    return "\(counter) seconds" 
} 

}

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

Куда я иду не так?

alertMessage screenshot countDownString screenshot

Я использую Xcode 7.3 и Swift 2,2

ответ

1

При создании экземпляра вашего UIAlertController в коде ниже, текущее значение из countDownString() копируется в виде сообщения и не могут быть обновлены таким образом

let alertController = UIAlertController(title: "Try again ", message: countDownString(), preferredStyle: .Alert) 

Вы должны сохранить свой UIAlertController как собственность объекта, примерно следующее:

var alertController: UIAlertController! 

изменить код для showAlert() на:

func showAlert(){ 
    alertController = UIAlertController(title: "Try again ", message: countDownString(), preferredStyle: .Alert) 
    presentViewController(alertController, animated: true){ 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self.decrease), userInfo: nil, repeats: true) 
    } 
} 

и обновлять alertController сообщение непосредственно в decrease() функции:

func decrease() 
{ 
    var minutes: Int 
    var seconds: Int 
    if(counter > 0) { 
     self.counter -= 1 
     print(counter) // Correct value in console 
     minutes = (counter % 3600)/60 
     seconds = (counter % 3600) % 60 
     alertController.message = String(format: "%02d:%02d", minutes, seconds) 
     print("\(minutes):\(seconds)") // Correct value in console 
    } 
    else{ 
     dismissViewControllerAnimated(true, completion: nil) 
     timer!.invalidate() 
    } 
} 
+1

такое же решение. но ты избил меня. :) –

+0

Отлично, спасибо, хорошо работает. Одна маленькая икота, сначала она отображает 5, затем 00:04, 00:03 и т. Д. Как я могу изменить начальную переменную, чтобы отобразить 00:05 в соответствии с остальными? – scooby

+0

Или даже не отображать начальное значение? – scooby

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

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