Browse Source

优化代码 vm + rx

openlockPPP 1 year ago
parent
commit
49f514bb70

+ 16 - 0
JiaPeiManage.xcodeproj/project.pbxproj

@@ -71,6 +71,8 @@
 		909DA5D12A3AC2460034501F /* UpdatePasswordViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */; };
 		909DA5D12A3AC2460034501F /* UpdatePasswordViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */; };
 		909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */; };
 		909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */; };
 		909DA5D52A3AE0160034501F /* MeTraineeSubjectCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */; };
 		909DA5D52A3AE0160034501F /* MeTraineeSubjectCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */; };
+		90A8CD462A5E763E00C02402 /* MeTraineeSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A8CD452A5E763E00C02402 /* MeTraineeSearchViewModel.swift */; };
+		90A8CD482A5EACB500C02402 /* MeTraineeSubjectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A8CD472A5EACB500C02402 /* MeTraineeSubjectViewModel.swift */; };
 		90BC4BD92A3B0F98006FD683 /* TraineeDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */; };
 		90BC4BD92A3B0F98006FD683 /* TraineeDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */; };
 		90BC4BDC2A3C2556006FD683 /* TVHeaderAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BDB2A3C2556006FD683 /* TVHeaderAnimator.swift */; };
 		90BC4BDC2A3C2556006FD683 /* TVHeaderAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BDB2A3C2556006FD683 /* TVHeaderAnimator.swift */; };
 		90BC4BDE2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BDD2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift */; };
 		90BC4BDE2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BDD2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift */; };
@@ -247,6 +249,8 @@
 		909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordViewController.xib; sourceTree = "<group>"; };
 		909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordViewController.xib; sourceTree = "<group>"; };
 		909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSubjectCell.swift; sourceTree = "<group>"; };
 		909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSubjectCell.swift; sourceTree = "<group>"; };
 		909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeSubjectCell.xib; sourceTree = "<group>"; };
 		909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeSubjectCell.xib; sourceTree = "<group>"; };
+		90A8CD452A5E763E00C02402 /* MeTraineeSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSearchViewModel.swift; sourceTree = "<group>"; };
+		90A8CD472A5EACB500C02402 /* MeTraineeSubjectViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSubjectViewModel.swift; sourceTree = "<group>"; };
 		90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraineeDataModel.swift; sourceTree = "<group>"; };
 		90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraineeDataModel.swift; sourceTree = "<group>"; };
 		90BC4BDB2A3C2556006FD683 /* TVHeaderAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TVHeaderAnimator.swift; sourceTree = "<group>"; };
 		90BC4BDB2A3C2556006FD683 /* TVHeaderAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TVHeaderAnimator.swift; sourceTree = "<group>"; };
 		90BC4BDD2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeDetailsPageViewController.swift; sourceTree = "<group>"; };
 		90BC4BDD2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeDetailsPageViewController.swift; sourceTree = "<group>"; };
@@ -448,6 +452,7 @@
 		9076C5D62A386AFA00E5E33F /* 学员 */ = {
 		9076C5D62A386AFA00E5E33F /* 学员 */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				90A8CD442A5E75FC00C02402 /* ViewModel */,
 				9076C5D82A386B0C00E5E33F /* Views */,
 				9076C5D82A386B0C00E5E33F /* Views */,
 				9076C5D72A386B0300E5E33F /* Controllers */,
 				9076C5D72A386B0300E5E33F /* Controllers */,
 			);
 			);
@@ -566,6 +571,15 @@
 			path = GJRatioAutoLayout;
 			path = GJRatioAutoLayout;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		90A8CD442A5E75FC00C02402 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				90A8CD452A5E763E00C02402 /* MeTraineeSearchViewModel.swift */,
+				90A8CD472A5EACB500C02402 /* MeTraineeSubjectViewModel.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
 		90BC4BDA2A3C2541006FD683 /* RefreshHeaderAnimation */ = {
 		90BC4BDA2A3C2541006FD683 /* RefreshHeaderAnimation */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1181,6 +1195,7 @@
 				90CE528C2A36E5460033BD06 /* Action.swift in Sources */,
 				90CE528C2A36E5460033BD06 /* Action.swift in Sources */,
 				90CE52CE2A36E5EC0033BD06 /* UICollectionViewFlexLayout+Rx.swift in Sources */,
 				90CE52CE2A36E5EC0033BD06 /* UICollectionViewFlexLayout+Rx.swift in Sources */,
 				909DA5CF2A3AC23B0034501F /* UpdatePasswordViewController.swift in Sources */,
 				909DA5CF2A3AC23B0034501F /* UpdatePasswordViewController.swift in Sources */,
+				90A8CD462A5E763E00C02402 /* MeTraineeSearchViewModel.swift in Sources */,
 				90CE52DD2A36E6250033BD06 /* CompositionRoot.swift in Sources */,
 				90CE52DD2A36E6250033BD06 /* CompositionRoot.swift in Sources */,
 				90CE52BE2A36E5B70033BD06 /* RequestError.swift in Sources */,
 				90CE52BE2A36E5B70033BD06 /* RequestError.swift in Sources */,
 				90CE52342A36E4600033BD06 /* BaseTableViewController.swift in Sources */,
 				90CE52342A36E4600033BD06 /* BaseTableViewController.swift in Sources */,
@@ -1270,6 +1285,7 @@
 				909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */,
 				909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */,
 				90CE52BD2A36E5B70033BD06 /* NetEnvironment.swift in Sources */,
 				90CE52BD2A36E5B70033BD06 /* NetEnvironment.swift in Sources */,
 				90971E692A493BCB00267B7F /* MeTabBarController.swift in Sources */,
 				90971E692A493BCB00267B7F /* MeTabBarController.swift in Sources */,
+				90A8CD482A5EACB500C02402 /* MeTraineeSubjectViewModel.swift in Sources */,
 				90CE52BB2A36E5B70033BD06 /* LoadingPlugin.swift in Sources */,
 				90CE52BB2A36E5B70033BD06 /* LoadingPlugin.swift in Sources */,
 				90CE52F42A36EDCF0033BD06 /* NYArticleNavBar.swift in Sources */,
 				90CE52F42A36EDCF0033BD06 /* NYArticleNavBar.swift in Sources */,
 				90CE52A62A36E59A0033BD06 /* String+BoundingRect.swift in Sources */,
 				90CE52A62A36E59A0033BD06 /* String+BoundingRect.swift in Sources */,

+ 7 - 0
JiaPeiManage/Sources/Main/Base/BaseTableViewController.swift

@@ -134,3 +134,10 @@ extension BaseTableViewController:EmptyDelegate,EmptyDataSource {
         return isEmptyDisplay
         return isEmptyDisplay
     }
     }
 }
 }
+
+extension BaseTableViewController:UIScrollViewDelegate {
+
+    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
+        self.view.endEditing(true)
+    }
+}

+ 1 - 1
JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.swift

@@ -200,7 +200,7 @@ final class LoginViewController: BaseViewController {
                 }
                 }
             }
             }
             self?.city = item!.dictValue //编码
             self?.city = item!.dictValue //编码
-            self?.cityPower = item!.remark //地区权
+            self?.cityPower = item!.remark //地区权
             self?.userlocation_textField.text = item?.dictLabel
             self?.userlocation_textField.text = item?.dictLabel
             dialogViewController.hide()
             dialogViewController.hide()
         }
         }

+ 34 - 60
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.swift

@@ -11,30 +11,17 @@ import RxCocoa
 final class MeTraineeSearchPageViewController: BaseTableViewController {
 final class MeTraineeSearchPageViewController: BaseTableViewController {
     
     
     let cellIdentifier:String = "_MeTraineeSubjectCellSearch"
     let cellIdentifier:String = "_MeTraineeSubjectCellSearch"
-    // MARK: 服务属性
-    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
     // MARK: UI属性
     // MARK: UI属性
-//    @IBOutlet weak var nav_top_layout: NSLayoutConstraint!
     @IBOutlet weak var searchView: UIView!
     @IBOutlet weak var searchView: UIView!
     //搜索
     //搜索
     @IBOutlet weak var search_textfield: QMUITextField!
     @IBOutlet weak var search_textfield: QMUITextField!
     //搜按钮
     //搜按钮
     @IBOutlet weak var search_button: UIButton!
     @IBOutlet weak var search_button: UIButton!
     
     
-    
-    //search bar
-//    let search_bar = QMUISearchBar().then {
-//        $0.backgroundColor = UIColor("#26486B")
-//        $0.layer.cornerRadius = 15.f
-//        $0.layer.masksToBounds = true
-//    }
-    
+    let meTraineeSearchViewModel = MeTraineeSearchViewModel()
+
     let headerView = MeTraineeSubjectHeaderView.loadFromNib()
     let headerView = MeTraineeSubjectHeaderView.loadFromNib()
-    // MARK: 数据
-    var traineeDataModel:TraineeDataModel?
-    var page:Int = 1
-    var pageSize:Int = 100
-    var state = ""
+    
     //重置约束
     //重置约束
     override func setupConstraints() {
     override func setupConstraints() {
         self.tableView.snp.remakeConstraints { make in
         self.tableView.snp.remakeConstraints { make in
@@ -57,12 +44,11 @@ final class MeTraineeSearchPageViewController: BaseTableViewController {
         self.view.backgroundColor = .db_theme
         self.view.backgroundColor = .db_theme
 //        self.searchView.addSubview(search_bar)
 //        self.searchView.addSubview(search_bar)
         self.search_textfield.placeholderColor = .db_place
         self.search_textfield.placeholderColor = .db_place
-        tableView.delegate = self
         tableView.dataSource = self
         tableView.dataSource = self
+        tableView.delegate = self
         tableView.separatorStyle = .none //去除分割线
         tableView.separatorStyle = .none //去除分割线
         tableView.register(UINib(nibName: "MeTraineeSubjectCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
         tableView.register(UINib(nibName: "MeTraineeSubjectCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
         tableView.rowHeight = 288.f
         tableView.rowHeight = 288.f
-        
         setupRefreshHeader(tableView) {[unowned self] in
         setupRefreshHeader(tableView) {[unowned self] in
             DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
             DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                 // 在延迟 1 秒后执行的代码
                 // 在延迟 1 秒后执行的代码
@@ -71,8 +57,7 @@ final class MeTraineeSearchPageViewController: BaseTableViewController {
             NSLog("AAAAAAA")
             NSLog("AAAAAAA")
         }
         }
         self.isEmptyDisplay = false
         self.isEmptyDisplay = false
-        //获取第一响应者
-        
+
     }
     }
     
     
     //绑定-rx
     //绑定-rx
@@ -83,73 +68,62 @@ final class MeTraineeSearchPageViewController: BaseTableViewController {
             .subscribe(onNext: { [unowned self] searchText in
             .subscribe(onNext: { [unowned self] searchText in
                 // Handle the updated search text here
                 // Handle the updated search text here
                 print("Search text changed: \(searchText)")
                 print("Search text changed: \(searchText)")
-                self.searchCoachInfoList()
+//                self.searchCoachInfoList()
+                self.meTraineeSearchViewModel.searchCoachInfoList(searchPageVC: self)
             })
             })
             .disposed(by: disposeBag)
             .disposed(by: disposeBag)
         
         
-    }
-    
-    func searchCoachInfoList()
-    {
-        print("网络请求")
-        self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: search_textfield.text!, pageNum: page, pageSize: pageSize, schoolId: 0, state: state)
-            .subscribe(onSuccess: { traineeDataModel in
-                self.traineeDataModel = traineeDataModel
-                print("coachInfoListRequest成功")
-                self.isEmptyDisplay = true
-                self.hideLoadAnimation()
-                self.tableView.reloadData()
-            }, onError: { error in
-            })
-            .disposed(by: disposeBag)
+        //RX 绑定
+//        self.meTraineeSearchViewModel.items
+//            .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier,cellType:MeTraineeSubjectCell.self)) { (row, model, cell) in
+//                cell.index_button.setTitle("\(row+1)", for: .normal)
+//                cell.setRowInfo(rowInfo:model as! RowInfo)
+//            }
+//            .disposed(by: disposeBag)
+
+        // tableView点击事件
+        tableView.rx.itemSelected.subscribe(onNext: { [weak self]indexPath in
+            print("点击\(indexPath)行")
+            let rowInfo:RowInfo = (self!.meTraineeSearchViewModel.traineeDataModel?.rows![indexPath.row])!
+            if rowInfo != nil {
+                let context: Int = rowInfo.id!
+                NYSwRouter.push(NYSwPushType.trainee_info,context: context)
+            }
+            self?.tableView.deselectRow(at: indexPath, animated: false)
+        }).disposed(by: disposeBag)
+
     }
     }
     
     
 }
 }
 
 
 //数据源
 //数据源
 extension MeTraineeSearchPageViewController:UITableViewDataSource {
 extension MeTraineeSearchPageViewController:UITableViewDataSource {
-    
     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
-        if traineeDataModel != nil {
-            let total = String(format: "%d", traineeDataModel?.total ?? 0)
+        if self.meTraineeSearchViewModel.traineeDataModel != nil {
+            let total = String(format: "%d", self.meTraineeSearchViewModel.traineeDataModel?.total ?? 0)
             headerView.total_label.text = "总数:"+total
             headerView.total_label.text = "总数:"+total
         }
         }
         return headerView
         return headerView
     }
     }
-    
+
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
         return 55.f
         return 55.f
     }
     }
-    
+
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return traineeDataModel?.rows!.count ?? 0
+        return self.meTraineeSearchViewModel.traineeDataModel?.rows!.count ?? 0
     }
     }
-    
+
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! MeTraineeSubjectCell
         let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! MeTraineeSubjectCell
         cell.index_button.setTitle("\(indexPath.row+1)", for: .normal)
         cell.index_button.setTitle("\(indexPath.row+1)", for: .normal)
-        cell.setRowInfo(rowInfo: (self.traineeDataModel?.rows?[indexPath.row])!)
+        cell.setRowInfo(rowInfo: (self.meTraineeSearchViewModel.traineeDataModel?.rows?[indexPath.row])!)
         return cell
         return cell
     }
     }
 }
 }
 
 
 //事件
 //事件
 extension MeTraineeSearchPageViewController:UITableViewDelegate {
 extension MeTraineeSearchPageViewController:UITableViewDelegate {
-    
-    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        tableView.deselectRow(at: indexPath, animated: false)
-        let rowInfo:RowInfo = (self.traineeDataModel?.rows![indexPath.row])!
-        if rowInfo != nil {
-            let context: Int = rowInfo.id!
-            NYSwRouter.push(NYSwPushType.trainee_info,context: context)
-        }
-    }
-    
 }
 }
 
 
-extension MeTraineeSearchPageViewController:UIScrollViewDelegate {
-    
-    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
-        self.view.endEditing(true)
-    }
-}
+

+ 50 - 0
JiaPeiManage/Sources/Modulars/学员/ViewModel/MeTraineeSearchViewModel.swift

@@ -0,0 +1,50 @@
+//
+//  MeTraineeSearchViewModel.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/7/12.
+//
+
+import UIKit
+import RxSwift
+
+class MeTraineeSearchViewModel: NSObject {
+    
+    // MARK: 服务属性
+    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+    // MARK: 数据
+    var traineeDataModel:TraineeDataModel?
+    var page:Int = 1
+    var pageSize:Int = 100
+    var state = ""
+    
+    private let itemsSubject = BehaviorSubject<[RowInfo]>(value: [])
+        
+    var items: Observable<[RowInfo]> {
+        return itemsSubject.asObservable()
+    }
+    
+    override init() {
+        super.init()
+//        searchCoachInfoList()
+    }
+
+    /// 数据请求
+    func searchCoachInfoList(searchPageVC:MeTraineeSearchPageViewController)
+    {
+        print("网络请求")
+        self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: searchPageVC.search_textfield.text!, pageNum: page, pageSize: pageSize, schoolId: 0, state: state)
+            .subscribe(onSuccess: { [unowned self] traineeDataModel in
+                self.traineeDataModel = traineeDataModel
+//                itemsSubject.onNext(traineeDataModel.rows!)
+                print("coachInfoListRequest成功")
+                searchPageVC.isEmptyDisplay = true
+                searchPageVC.hideLoadAnimation()
+                searchPageVC.stopRefresh()
+                searchPageVC.tableView.reloadData()
+            }, onError: { error in
+                searchPageVC.stopRefresh()
+            })
+            .disposed(by: searchPageVC.disposeBag)
+    }
+}

+ 16 - 0
JiaPeiManage/Sources/Modulars/学员/ViewModel/MeTraineeSubjectViewModel.swift

@@ -0,0 +1,16 @@
+//
+//  MeTraineeSubjectViewModel.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/7/12.
+//
+
+import UIKit
+import RxSwift
+
+class MeTraineeSubjectViewModel: NSObject {
+    
+    // MARK: 服务属性
+    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+    
+}