diff --git a/LearnEnglish/LearnEnglish/Views/QuizViewController.swift b/LearnEnglish/LearnEnglish/Views/QuizViewController.swift index ff4297a..b82b7b4 100644 --- a/LearnEnglish/LearnEnglish/Views/QuizViewController.swift +++ b/LearnEnglish/LearnEnglish/Views/QuizViewController.swift @@ -21,9 +21,11 @@ final class QuizViewController: UIViewController { private let spellingHintLabel = UILabel() private let resultLabel = UILabel() private let resultPhoneticLabel = UILabel() + private let countdownLabel = UILabel() private let nextButton = UIButton(type: .system) private var optionButtons: [UIButton] = [] private var optionIcons: [UIImageView] = [] + private var countdownTimer: Timer? private let promptStack = UIStackView() private let inputStack = UIStackView() @@ -48,6 +50,10 @@ final class QuizViewController: UIViewController { @available(*, unavailable) required init?(coder: NSCoder) { fatalError() } + deinit { + countdownTimer?.invalidate() + } + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground @@ -135,7 +141,11 @@ final class QuizViewController: UIViewController { resultStack.axis = .vertical resultStack.spacing = 12 - [resultLabel, resultPhoneticLabel, nextButton].forEach { resultStack.addArrangedSubview($0) } + countdownLabel.font = .preferredFont(forTextStyle: .caption1) + countdownLabel.textColor = .tertiaryLabel + countdownLabel.textAlignment = .center + countdownLabel.isHidden = true + [resultLabel, resultPhoneticLabel, countdownLabel, nextButton].forEach { resultStack.addArrangedSubview($0) } let mainStack = UIStackView(arrangedSubviews: [headerStack, promptStack, inputStack, resultStack, UIView()]) mainStack.axis = .vertical @@ -358,6 +368,18 @@ final class QuizViewController: UIViewController { if config.isStudyMode { nextButton.isHidden = true let delay: TimeInterval = correct ? 1.0 : 3.0 + countdownLabel.text = "\(Int(delay)) 秒后继续" + countdownLabel.isHidden = false + countdownTimer?.invalidate() + var remaining = Int(delay) + countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in + remaining -= 1 + if remaining > 0 { + self?.countdownLabel.text = "\(remaining) 秒后继续" + } else { + timer.invalidate() + } + } DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in self?.restart() } @@ -440,6 +462,8 @@ final class QuizViewController: UIViewController { } private func restart() { + countdownTimer?.invalidate() + countdownLabel.isHidden = true view.subviews.compactMap { $0 as? QuizResultView }.forEach { $0.removeFromSuperview() } questions = QuizGenerator.makeQuestions(mode: config.mode, words: config.words) currentIndex = 0