如何在不同的视图控制器中按钮手势后重置计时器?

时间:2017-07-26 02:07:59

标签: swift timer uinavigationcontroller delegates

我正在开发一个测验应用程序,用户随机询问一个问题,并且必须在初始视图控制器上回答它。如果用户正确选择,则会出现第二个视图控制器,其中包含一个按钮,该按钮将视图控制器弹出导航堆栈并返回初始视图控制器以完成其他问题。但是,每次弹出第二个视图控制器时,我都会有一个我想要重置的计时器(从15秒开始),初始视图控制器出现下一个问题。我该如何完成这项任务?我已经在我的swift文件中有倒计时器代码。我只需要知道每次弹出/删除第二个视图控制器时如何让它从头开始。

这是我的初始视图控制器的代码:

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)
    }
}

以下是第二个视图控制器的代码:

 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()
    }
}

2 个答案:

答案 0 :(得分:0)

  

如何在按钮按下不同视图后重置倒数计时器   控制器?

  • 因此,如果您可以获得您所拥有的ViewView控制器的引用 设置计时器,然后您可以访问以前的计数器变量 在第二个viewController中查看控制器并在推送时 按钮刚刚重置为0。
  • 如果您无法使用上述方法,则另一种方法是创建 静态变量并在任何地方访问它并重置如下: -
static var counter = 0

答案 1 :(得分:0)

如果您正在弹出/移除第二个视图控制器并因此返回到第一个视图控制器,则可以在第一个视图控制器中的viewDidAppear func中重置计时器。这样,每次出现视图时计时器都会重新启动 - 第一次,以及每当第二次弹出时。