2016-02-25 4 views
0

Я работаю на таймер обратного отсчета для моего приложения, который начинает обратный отсчет от 15 Это мой код:Ошибка сигнала SIGABRT во время таймера обратного отсчета?

// 
// ViewController2.swift 
// MYP_TruthOrDare? 
// 
// 

import UIKit 

class ViewController2: UIViewController { 

    var countd = 15 

    @IBOutlet weak var Timer: UILabel! 
// 
// 
    override func viewDidLoad() { 
    super.viewDidLoad() 
     Timer.text = String(countd) 
//  

     var time:NSTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true) 
     func updateCounter() { 

      Timer.text = String(countd) 

      if (countd > 0){ 

       Timer.text = String(countd--) 
       Timer.text = String(countd) 

      } 

    } 
} 



     // Do any additional setup after loading the view. 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

Однако, когда я запускаю его, как только я получаю к части с таймером Я вижу метку flash 15 на секунду, но затем она сразу же падает с ошибкой SIGABRT. Что я могу сделать?

ответ

1

Как правило, таймер добавляется к NSRunLoop.

let myTimer = NSTimer(timeInterval: 1.0, target: self, selector: "updateCounter", userInfo: nil, repeats: true) 
NSRunLoop.mainRunLoop().addTimer(myTimer, forMode: NSDefaultRunLoopMode) 

Проверьте API для других режимов цикла в соответствии с вашими потребностями.

Кроме того, у вас есть функция updateCounter объявленная в вашем viewDidLoad() ...

0

Как здесь сказал Алекс. Вы определили функцию updateCounter внутри viewDidLoad, что может вызвать проблемы.

Также не забудьте добавить : (двоеточие) в название селектора.

NSTimer(timeInterval: 1.0, target: self, selector: "updateCounter:", userInfo: nil, repeats: true) 

и определить свой метод как это:

func updateCounter(timer: NSTimer) { 
    // Do something. 
} 
0

Ваша проблема в том, что вы кладете функцию ваш NSTimer вызывает внутри одной и той же функции, что в вас есть и NSTimer и функции. (updateCounter) in viewdidload. Чтобы предотвратить сбой SIGABRT, вы должны взять функцию updateCounter из viewdidload.

Вот что должен делать ваш код, с updateCounter вне viewdidload.

import UIKit 

class ViewController2: UIViewController { 

    var countd = 15 

    @IBOutlet weak var Timer: UILabel! 
// 
// 

func updateCounter() { 

      Timer.text = String(countd) 

      if (countd > 0){ 

       Timer.text = String(countd--) 
       Timer.text = String(countd) 

      } 

    } 
    override func viewDidLoad() { 
    super.viewDidLoad() 
     Timer.text = String(countd) 
//  

     var time:NSTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true) 

} 
}