From 41aa6375f4086c3bbabd00c710c0734b25962d78 Mon Sep 17 00:00:00 2001
From: 无故事王国 <841720330@qq.com>
Date: 星期日, 27 七月 2025 22:54:38 +0800
Subject: [PATCH] 修复BUG,修改逻辑

---
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift |   93 +++++++++++++++++++++++++++++++---------------
 1 files changed, 63 insertions(+), 30 deletions(-)

diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
index 629a463..54e6296 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -54,8 +54,7 @@
 class HomeListenFightViewModel{
 
     /// 当前页数
-    var currentPage = BehaviorRelay<Int>(value: 0)
-    //    var subPage = BehaviorRelay<Int>(value: 1) //小题目角标
+    var currentPage = BehaviorRelay<Int?>(value: nil)
     var maxPage = BehaviorRelay<Int>(value: 5)
     var listenType = BehaviorRelay<ListenType>(value:.lesson1)
     var times:Int = 0
@@ -247,7 +246,7 @@
         btn_beAgain.addTarget(self, action: #selector(beAgaionAction), for: .touchUpInside)
 
         setPages()
-        pageVC.reloadData()
+//        pageVC.reloadData()
 
         timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
             self?.viewModel.times += 1
@@ -267,13 +266,23 @@
 
                 if let m  = data as? ListenNewModel{
                     self.pages = Array<ListenSubCardModel>.splitArray(m.list, subArraySize: 4)
-                    let c = m.list.count / 4
+                    let c = m.subjectList.count
                     let totalW = 24 * c + 2 * (c - 1)
                     collection_card.snp.updateConstraints { make in
                         make.width.equalTo(totalW)
                     }
                 }
-            case .lesson2,.lesson3,.lesson4,.lesson5:
+
+            case .lesson4:
+                if let m  = data as? ListenNewModel{
+                    self.pages = Array<ListenSubCardModel>.splitArray(m.list, subArraySize: 4)
+                    let totalW = 24 * m.subjectList.count + 2 * (m.subjectList.count - 1)
+                    collection_card.snp.updateConstraints { make in
+                        make.width.equalTo(totalW)
+                    }
+                }
+
+            case .lesson2,.lesson3,.lesson5:
                 if let m  = data as? ListenNewModel{
                     self.pages = Array<ListenSubCardModel>.splitArray(m.list, subArraySize: 1)
                     let totalW = 24 * m.list.count + 2 * (m.list.count - 1)
@@ -289,6 +298,7 @@
                 collection_card.reloadData()
                 let nextPage = floor(Double(maxPage) / 5.0)
                 pageVC.scroll(toPage: Int(nextPage), animation: false)
+                viewModel.currentPage.accept(Int(nextPage))
                 viewModel.answerCount.accept(maxPage)
                 setPages()
 
@@ -434,7 +444,7 @@
     override func setRx() {
         NotificationCenter.default.rx.notification(NextLession_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in
             guard let weakSelf = self else { return }
-            let nextPage = weakSelf.viewModel.currentPage.value + 1
+            let nextPage = (weakSelf.viewModel.currentPage.value ?? 0) + 1
             var asComplete:Bool = false
             switch weakSelf.viewModel.listenType.value {
             case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:asComplete = nextPage >= (weakSelf.data as! ListenNewModel).subjectList.count
@@ -481,6 +491,7 @@
 
         viewModel.currentPage.subscribe(onNext: {[weak self]currentPage in
             guard let weakSelf = self else { return }
+            guard let currentPage else {return}
             weakSelf.btn_forward.isHidden = currentPage <= 0
             weakSelf.setPages()
         }).disposed(by: disposeBag)
@@ -491,56 +502,69 @@
     }
 
     private func setPages(){
+        guard let currentPage = viewModel.currentPage.value else {return}
         switch viewModel.listenType.value{
         case .lesson1:
             let m = data as! ListenNewModel
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.flatMap({$0}).count / 4)"
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.flatMap({$0}).count / 4)"
             let correctNum = m.list.filter({$0.status == 2}).count //正确
             //                if correctNum > 0 {
             let ratio = Double(correctNum) / Double(m.list.count) * 100.0
             let ratioStr = ratio.jq_formatFloat
 
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.flatMap({$0}).count / 4)\n正确率:\(ratioStr)%"
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.flatMap({$0}).count / 4)\n正确率:\(ratioStr)%"
             //                }
 
             maxPage = viewModel.answerCount.value
             btn_forward.isHidden = viewModel.answerCount.value == 1
         case .lesson3:
             let m = data as! ListenNewModel
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count / 6)"
-            btn_forward.isHidden = viewModel.currentPage.value == 0
-            let page = viewModel.currentPage.value + 1
+//            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count / 6)"
+            btn_forward.isHidden = currentPage == 0
+            let page = currentPage + 1
             maxPage = page
 
             let correctNum = m.list.filter({$0.status == 2}).count //正确
             let ratio = Double(correctNum) / Double(m.list.count) * 100.0
             let ratioStr = ratio.jq_formatFloat
-            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.count)\n正确率:\(ratioStr)%"
 
-        case .lesson2,.lesson5:
+        case .lesson2:
             let m = data as! ListenNewModel
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
+//            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
             btn_forward.isHidden = viewModel.currentPage.value == 0
-            let page = viewModel.currentPage.value + 1
+            let page = currentPage + 1
             maxPage = page
 
             let correctNum = m.list.filter({$0.status == 2}).count //正确
             let ratio = Double(correctNum) / Double(m.list.count) * 100.0
             let ratioStr = ratio.jq_formatFloat
-            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.count)\n正确率:\(ratioStr)%"
+
+        case .lesson5:
+            let m = data as! ListenNewModel
+//            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
+            btn_forward.isHidden = viewModel.currentPage.value == 0
+            let page = currentPage + 1
+            maxPage = page
+
+            let correctNum = m.list.filter({$0.status == 2}).count //正确
+            let ratio = Double(correctNum) / Double(m.list.count) * 100.0
+            let ratioStr = ratio.jq_formatFloat
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.count)\n正确率:\(ratioStr)%"
 
         case .lesson4:
             let m = data as! ListenNewModel
             //两题为一组:需要/2
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(m.subjectList.count)"
-            let page = viewModel.currentPage.value + 1
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(m.subjectList.count)"
+            let page = currentPage + 1
             //																maxPage = max(page,maxPage)
             maxPage = page
 
             let correctNum = m.list.filter({$0.status == 2}).count //正确
             let ratio = Double(correctNum) / Double(m.list.count) * 100.0
             let ratioStr = ratio.jq_formatFloat
-            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.flatMap({$0}).count)\n正确率:\(ratioStr)%"
+            label_pageNum.text = "已完成:\(viewModel.answerCount.value)/\(m.subjectList.count)\n正确率:\(ratioStr)%"
         case .game1,.game2:
             btn_forward.isHidden = true
             label_pageNum.isHidden = true
@@ -550,7 +574,7 @@
             }
         case .story1:
             if viewModel.listenType.value == .story2{
-                btn_next.isHidden = (viewModel.currentPage.value + 1) == viewModel.maxPage.value
+                btn_next.isHidden = (currentPage + 1) == viewModel.maxPage.value
                 if btn_next.isHidden{
                     btn_exit.setTitle("完成", for: .normal)
                 }
@@ -559,7 +583,7 @@
         case .story2:
             let count = (data as! Listen1Model).storyList.count
             viewModel.maxPage.accept(count)
-            label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(count)"
+            label_pageNum.text = "已完成:\(currentPage + 1)/\(count)"
         }
     }
 
@@ -764,9 +788,10 @@
     }
 
     @objc func beforeAction(){
+        guard let currentPage = viewModel.currentPage.value else {return}
 
         listenFightLine = .before
-        let beforePage = max(0, viewModel.currentPage.value - 1)
+        let beforePage = max(0, currentPage - 1)
         switch viewModel.listenType.value {
         case .lesson1:
             if !(pageVC.currentController as! HomeListenFight_lesson_1_VC).isListen{
@@ -794,9 +819,7 @@
 
         if viewModel.listenType.value == .lesson1{
             let currentVC = pageVC.currentController as! HomeListenFight_lesson_1_VC
-            //												if (viewModel.answerCount.value - 1 ) % 4 != 0 || viewModel.answerCount.value <= 4{
             currentVC.tobefore();return
-            //												}
         }
 
         if viewModel.listenType.value == .lesson3{
@@ -856,6 +879,7 @@
 
     func pageViewController(_ pageViewController: FFPageViewController, currentPageChanged currentPage: Int) {
 
+        viewModel.currentPage.accept(currentPage)
         if listenFightLine == .before{
             restore()
         }
@@ -949,21 +973,30 @@
 
 extension HomeListenFightVC:UICollectionViewDelegate{
     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        guard pageVC.currentPage != indexPath.row else {return}
         if let m = data as? ListenNewModel{
-            guard m.list[indexPath.row].status != 1 else{return}
-            guard pageVC.currentPage != indexPath.row else {return}
+            if viewModel.listenType.value == .lesson1{
+                guard pages[indexPath.row].filter({$0.status == 2}).count == 4 else {return}
+            }else{
+                guard m.list[indexPath.row].status != 1 else{return}
+            }
+
             pageVC.scroll(toPage: indexPath.row, animation: true)
-            //todo
         }
     }
 }
 
 extension HomeListenFightVC:UICollectionViewDataSource{
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
-        if let m = data as? ListenNewModel{
+        if data is ListenNewModel{
             if viewModel.listenType.value == .lesson1{
-                return pages.count
+                return (data as! ListenNewModel).subjectList.count
             }
+
+            if viewModel.listenType.value == .lesson2{
+                return (data as! ListenNewModel).subjectList.count
+            }
+
             return pages.count
         }
         return 0
@@ -971,7 +1004,7 @@
 
     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
         let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_CardItemCCell", for: indexPath) as! CardItemCCell
-        if let m = data as? ListenNewModel{
+        if data is ListenNewModel{
             let model = pages[indexPath.row]
             cell.titleL.text = "\(indexPath.row + 1)"
 

--
Gitblit v1.7.1