2017-07-26 3 views
0

私は、ユーザーがランダムに質問され、最初のビューコントローラーで答えなければならないクイズアプリを開発しています。ユーザーが正しく選択すると、ナビゲーションスタックからビューコントローラをポップし、最初のビューコントローラに戻り、他の質問を終了するボタンを含む2番目のビューコントローラが表示されます。しかし、2番目のView Controllerがポップされ、最初のView Controllerが次の質問とともに表示されるたびに、リセットするタイマーがあります(15秒に開始します)。私はこの仕事をどのように達成するでしょうか?私はすでに私の迅速なファイルにカウントダウンタイマーのコードを持っています。 2番目のView Controllerがポップ/削除されるたびに最初から始める方法を知る必要があります。ここで別のビューコントローラでボタンジェスチャの後にタイマーをリセットするにはどうすればいいですか?

は、初期ビューコントローラのための私のコードです:

import UIKit 

extension ViewController: QuizCompletedDelegate { 
    func continueQuiz() { 

     randomQuestion() 
    } 
} 


class ViewController: UIViewController { 


    var questionList = [String]() 


    func updateCounter() { 
     counter -= 1 
     questionTimer.text = String(counter) 

     if counter == 0 { 
      timer.invalidate() 
      wrongSeg() 
      counter = 15 
     } 
    } 


    func randomQuestion() { 
     //random question 
     if questionList.isEmpty { 
      questionList = Array(QADictionary.keys) 
     } 

     let rand = Int(arc4random_uniform(UInt32(questionList.count))) 
     questionLabel.text = questionList[rand] 

     //matching answer values to go with question keys 
     var choices = QADictionary[questionList[rand]]! 

     questionList.remove(at: rand) 

     //create button 
     var button:UIButton = UIButton() 

     //variables 
     var x = 1 
     rightAnswerBox = arc4random_uniform(4)+1 

     for index in 1...4 { 
      button = view.viewWithTag(index) as! UIButton 

      if (index == Int(rightAnswerBox)) { 
      button.setTitle(choices[0], for: .normal) 
      } else { 
       button.setTitle(choices[x], for: .normal) 
       x += 1 
      } 
      randomImage() 

     } 
    } 


    let QADictionary = ["Who is Thor's brother?" : ["Atum", "Loki", "Red Norvell", "Kevin Masterson"], "What is the name of Thor's hammer?" : ["Mjolinr", "Uru", "Stormbreaker", "Thundara"], "Who is the father of Thor?" : ["Odin", "Sif", "Heimdall", "Balder"]] 

    //wrong view segue 
    func wrongSeg() { 
     performSegue(withIdentifier: "incorrectSeg", sender: self) 
    } 

    //proceed screen 
    func rightSeg() { 
     performSegue(withIdentifier: "correctSeg", sender: self) 
    } 


    //variables 
    var rightAnswerBox:UInt32 = 0 
    var index = 0 

    //Question Label 
    @IBOutlet weak var questionLabel: UILabel! 

    //Answer Button 
    @IBAction func buttonAction(_ sender: AnyObject) { 

     if (sender.tag == Int(rightAnswerBox)) { 
      rightSeg() 
      print ("Correct!") 
     } 

     if counter != 0 { 
      counter = 15 
      questionTimer.text = String(counter) 
     } else if (sender.tag != Int(rightAnswerBox)) { 
      wrongSeg() 
      print ("Wrong!") 
     timer.invalidate() 
     questionList = [] 
     } 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     randomQuestion() 
    } 

    //variables 
    var counter = 15 
    var timer = Timer() 
    @IBOutlet weak var questionTimer: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     timer = Timer.scheduledTimer(timeInterval: 1, target:self, selector: #selector(ViewController.updateCounter), userInfo: nil, repeats: true) 
    } 
} 

ここで第2のビューコントローラのコードです:ボタンの後にカウントダウンタイマーのリセットを行うための方法

class ContinueScreen: UIViewController { 

    var delegate: QuizCompletedDelegate? 

    //correct answer label 
    @IBOutlet weak var correctLbl: UILabel! 

    //background photo 
    @IBOutlet weak var backgroundImage: UIImageView! 




    func backToQuiz() { 
     delegate?.continueQuiz() 

     if let nav = self.navigationController { 
      nav.popViewController(animated: true) 
     } else { 
      self.dismiss(animated: true, completion: nil) 
     } 
    } 

    @IBAction func `continue`(_ sender: Any) { 
     backToQuiz() 
    } 

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

答えて

0

別のビューを押してください コントローラ?

  • あなたが セットアップを持っているyourViewコントローラの参照にタイマーを得ることができるのであれば、あなたはあなたの第二のViewController内部前回 ビューコントローラからのカウンタ変数にアクセスすることができますし、 ボタンを押したときだけ0にリセット。
  • 上記のアプローチはあなたのためにできない場合は、別の方法が に静的変数を作成し、どこにでもアクセスし、次のようにリセットされます: -
static var counter = 0 
0

あなたは第二のビューコントローラを取り外すため、最初に戻る/ポップされている場合、あなたはあなたの第一ビューコントローラであなたのviewDidAppear FUNCにタイマーをリセットできます。この方法では、ビューが表示されるたびにタイマーが再起動されます - 初めて、そして2番目がポップするたびに。

関連する問題