2017-09-24 5 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. 
    } 
} 

imジェスチャーを使用して制御できるストップウォッチを作成しようとしています。短く押すと停止/開始し、長押しすると時間がリセットされます。

答えて

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

Imは "#selector"の引数はObjective-Cに公開されていないインスタンスメソッド 'updateTimer()'を参照しています。 "違いがあれば、" SecondViewController "で作業しているはずです? – M4YDIE

+0

Selector(( "updateTimer")に変更するとエラーを修正するように見えますが、ボタンを押すとクラッシュします – M4YDIE

1
  • セレクタはあなたがviewDidLoadで関数を宣言するべきではありません#selector(ViewController.updateTimer)
  • 形で与えられるべきではなく外部
  • は、あなただけの設定:

    あなたの最終的なコードは次のようになりますタイマーはlongpressed機能

  • 停止するにはtimer.invalidate()
+1

彼はジェスチャー認識子を設定するために@IBActionsを使用しているので(すべてが適切に接続されていると)、viewDidLoadで#selector(ViewController.updateTimer)を宣言していないのはまったく問題ありません。 – Alex