2017-09-24 129 views
1

定時器作用域問題我一直堅持把它放到正確的範圍內。我確定它的東西超級簡單,但我用頭撞牆。我發現任何答案是在早期版本的迅速,所以即時通訊努力瞭解如何解決這個#selector

我目前的問題是試圖讓計時器正確初始化和計數。 「選擇者」造成的問題最多。其餘的我肯定是病得不行了

代碼如下。

@IBOutlet weak var shortTimerLabel: UILabel! 
@IBOutlet weak var longTimerLabel: UILabel! 

var seconds = 60 //This variable will hold a starting value of seconds. It could be any amount above 0. 
var timer = Timer() 
var isTimerRunning = false //This will be used to make sure only one timer is created at a time. 

@IBAction func longpressed(_ gestureRecognizer: UILongPressGestureRecognizer) { 
    shortTimerLabel.text = "longPressed" 

} 
@IBAction func tappedShortTimer(_ gestureRecognizer: UITapGestureRecognizer) { 
    shortTimerLabel.text = "ShortPressed" 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    func runTimer() { 
     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) 
    } 
    func updateTimer() { 
     seconds += 1  //This will decrement(count down)the seconds. 
     shortTimerLabel.text = "\(seconds)" //This will update the label. 
    } 
} 

即時通訊嘗試創建一個可以使用手勢進行控制的秒錶。短按標籤上的停止/開始,長按重置時間。

回答

1

在你的updateTimer()方法中,第一行應該改爲seconds -= 1(如果你想倒計數)。

此外,您可能需要更新您的updateTimer()方法是這樣的:

func updateTimer() { 

     seconds -= 1 

     if seconds == 0 { 
     timer.invalidate() 
     isTimerRunning = false 
     } 

     shortTimerLabel.text = String(describing: seconds) 
    } 

這裏的另一個問題是,你加入你的runTimer()updateTimer()方法來錯了地方。您不應該將加入您的viewDidLoad方法中。

你的最終代碼應該是這樣的:

var seconds = 60 
var timer = Timer() 
var isTimerRunning = false 

@IBAction func longpressed(_ gestureRecognizer: UILongPressGestureRecognizer) { 
    resetTimer() 
} 

@IBAction func tappedShortTimer(_ gestureRecognizer: UITapGestureRecognizer) { 
    stopStartTimer() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // ... 
} 

func stopStartTimer() { 

    if !isTimerRunning { 

     timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true) 

     isTimerRunning = true 

    } else { 

     timer.invalidate() 

     isTimerRunning = false 

    } 
} 

func updateTimer() { 

    seconds -= 1 

    if seconds == 0 { 
     timer.invalidate() 
     isTimerRunning = false 
    } 

    shortTimerLabel.text = String(describing: seconds) 
} 

func resetTimer() { 

    if isTimerRunning { 

     seconds = 60 

     timer.invalidate() 

     isTimerRunning = false 

     stopStartTimer() 
    } 
} 
+0

@ M4YDIE,如果此答案對您有幫助,請將其標記爲已接受,以便可以幫助其他人查找相同的答案。 :)如果您有任何其他問題,請隨時詢問我! – Alex

+0

我仍然收到一個類似的錯誤,「#selector的參數是指實例方法'updateTimer()'沒有公開給Objective-C」我應該注意到,即時通訊工作在「SecondViewController」,如果這有什麼區別? – M4YDIE

+0

更改爲選擇器((「updateTimer」))似乎修復了錯誤,但它在按下按鈕時崩潰 – M4YDIE

1
  • 的選擇應在形式給出#selector(ViewController.updateTimer)
  • viewDidLoad你不應該申報功能,但是外界
  • 你只設置longpressed函數中的計時器
  • 對於停止它是timer.invalidate()
+1

由於他使用@IBActions來設置他的手勢識別器(如果一切都正確連接),所以完全沒有在viewDidLoad中聲明#selector(ViewController.updateTimer)。 – Alex