From 342a2765d7d1c9d28605a002cffe506176299dab Mon Sep 17 00:00:00 2001 From: fish Date: Mon, 20 Jul 2026 08:14:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E8=AF=8D=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=A6=E4=B9=A0=E6=8C=89=E9=92=AE=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8D=95=E8=AF=8D=E6=8B=BC=E5=86=99=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- LearnEnglish/LearnEnglish/Models/Quiz.swift | 7 ++++++ .../Views/QuizViewController.swift | 23 +++++++++++++++---- .../Views/WordDetailViewController.swift | 7 ++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/LearnEnglish/LearnEnglish/Models/Quiz.swift b/LearnEnglish/LearnEnglish/Models/Quiz.swift index b265ac8..0f9a530 100644 --- a/LearnEnglish/LearnEnglish/Models/Quiz.swift +++ b/LearnEnglish/LearnEnglish/Models/Quiz.swift @@ -14,6 +14,13 @@ struct QuizSetupRequest: Hashable { struct QuizConfig: Hashable { let mode: QuizMode let words: [Word] + let isStudyMode: Bool + + init(mode: QuizMode, words: [Word], isStudyMode: Bool = false) { + self.mode = mode + self.words = words + self.isStudyMode = isStudyMode + } } struct QuizQuestion: Identifiable { diff --git a/LearnEnglish/LearnEnglish/Views/QuizViewController.swift b/LearnEnglish/LearnEnglish/Views/QuizViewController.swift index 38efc93..c21ac4b 100644 --- a/LearnEnglish/LearnEnglish/Views/QuizViewController.swift +++ b/LearnEnglish/LearnEnglish/Views/QuizViewController.swift @@ -347,9 +347,22 @@ final class QuizViewController: UIViewController { resultLabel.textColor = correct ? Theme.Color.correct : Theme.Color.wrong resultLabel.isHidden = false - nextButton.configuration?.title = currentIndex + 1 < questions.count ? "下一题" : "查看成绩" - nextButton.isEnabled = true - nextButton.isHidden = false + if config.isStudyMode { + if correct { + nextButton.isHidden = true + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { [weak self] in + self?.restart() + } + } else { + nextButton.configuration?.title = "继续学习" + nextButton.isEnabled = true + nextButton.isHidden = false + } + } else { + nextButton.configuration?.title = currentIndex + 1 < questions.count ? "下一题" : "查看成绩" + nextButton.isEnabled = true + nextButton.isHidden = false + } } @objc private func speakCurrentWord() { @@ -358,7 +371,9 @@ final class QuizViewController: UIViewController { } private func primaryButtonTapped() { - if config.mode == .spelling, selectedOption == nil { + if config.isStudyMode, selectedOption != nil { + restart() + } else if config.mode == .spelling, selectedOption == nil { guard let question = current, spellingView.isComplete else { return } submitSpelling(spellingView.typedWord(), for: question) } else if config.mode == .dictation, selectedOption == nil { diff --git a/LearnEnglish/LearnEnglish/Views/WordDetailViewController.swift b/LearnEnglish/LearnEnglish/Views/WordDetailViewController.swift index 7d67f52..ce7343a 100644 --- a/LearnEnglish/LearnEnglish/Views/WordDetailViewController.swift +++ b/LearnEnglish/LearnEnglish/Views/WordDetailViewController.swift @@ -31,6 +31,7 @@ final class WordDetailViewController: UIViewController { view.backgroundColor = .systemBackground title = categoryName navigationItem.largeTitleDisplayMode = .never + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "学习", style: .plain, target: self, action: #selector(startSpelling)) buildLayout() updateSpeakState() speechObserver = NotificationCenter.default.addObserver( @@ -186,6 +187,12 @@ final class WordDetailViewController: UIViewController { return card } + @objc private func startSpelling() { + Haptics.selection() + let config = QuizConfig(mode: .spelling, words: [word]) + navigationController?.pushViewController(QuizViewController(config: config), animated: true) + } + private func searchMeaning() { Haptics.selection() let text = "\(word.meaning) 是什么意思"