杨锴
2025-05-11 7453d2d0cef415b34323d1b91e6cfa4a6ba31178
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
    //
    //  SearchStoreListVC.swift
    //  WanPai
    //
    //  Created by 无故事王国 on 2023/6/30.
    //
 
import UIKit
import QMUIKit
import JQTools
import RxRelay
import RxSwift
 
 
class SearchStoreViewModel:RefreshModel<SearchStoreListModel>{
    
    let search = BehaviorRelay<String?>(value:nil)
    let space = BehaviorRelay<Int?>(value:nil) // 1=升序/2=降序
    var cityCode = BehaviorRelay<Int?>(value:nil)
 
    override func api() -> (Observable<BaseResponse<[SearchStoreListModel]>>)? {
        return Services.exploreStoreList(search: search.value, space: space.value, cityCode: cityCode.value)
    }
}
 
 
class SearchStoreListVC: BaseVC {
 
    @IBOutlet weak var btn_city: QMUIButton!
    @IBOutlet weak var btn_distance: QMUIButton!
    @IBOutlet weak var btn_limits: QMUIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var stackView: UIStackView!
    @IBOutlet weak var view_localtion: UIView!
    @IBOutlet weak var tf_searchStore: UITextField!
    private var cityChooseSubTypeView:CityChooseSubTypeView?
    private var viewModel = SearchStoreViewModel()
 
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "门店列表"
 
        viewModel.configure(tableView,needMore: false)
        viewModel.beginRefresh()
 
        let currentStatus = CLLocationManager.authorizationStatus()
        switch currentStatus {
            case .authorizedAlways,.authorizedWhenInUse:
                view_localtion.isHidden = true
                viewModel.beginRefresh()
            case .restricted,.denied:
                view_localtion.isHidden = false
            case .notDetermined:
                view_localtion.isHidden = true
                locationTool.startLocation { [weak self] local in
                    self?.viewModel.beginRefresh()
                    locationTool.stopLocation()
                } errorClouse: { error in
                    alertError(msg: "定位获取失败")
                }
            default:break
        }
    }
 
    override func setUI() {
        btn_city.imagePosition = .right
        btn_city.spacingBetweenImageAndTitle = 10
 
        btn_distance.imagePosition = .right
        btn_distance.spacingBetweenImageAndTitle = 6
 
        btn_limits.imagePosition = .left
        btn_limits.spacingBetweenImageAndTitle = 2
 
        stackView.jq_addShadows(shadowColor: UIColor(hexStr: "#DFDFDF").withAlphaComponent(0.5), corner: 0, radius: 4, offset: CGSize(width: 4, height: 0), opacity: 1)
 
        tableView.delegate = self
        tableView.dataSource = self
        tableView.separatorStyle = .none
        tableView.register(UINib(nibName: "SearchStoreTCell", bundle: nil), forCellReuseIdentifier: "_SearchStoreTCell")
 
        tf_searchStore.delegate = self
        tf_searchStore.returnKeyType = .search
    }
 
    override func setRx() {
        tf_searchStore.rx.text.orEmpty.bind(to: viewModel.search).disposed(by: disposeBag)
    }
 
    @IBAction func gotoSettingAction(_ sender: QMUIButton) {
        JQ_AuthorizesTool.default.openURL(.location)
    }
    
    @IBAction func cityAction(_ sender: QMUIButton) {
        guard !sender.isSelected else {return}
        sender.isSelected = true
        cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: stackView) { [weak self] m in
            self?.viewModel.space.accept(nil)
            self?.btn_distance.setImage(UIImage(named: "icon_sort_normal"), for: .normal)
            sender.setTitle(m.name, for: .normal)
            self?.viewModel.cityCode.accept(m.code)
            self?.viewModel.beginRefresh()
            sender.isSelected = false
        } closeClouse: {
            sender.isSelected = false
        }
    }
 
    @IBAction func distanceAction(_ sender: QMUIButton) {
        view.endEditing(true)
        sender.isSelected = !sender.isSelected
        let sortType = sender.isSelected ? 1:2
        viewModel.space.accept(sortType)
        sender.setImage(sortType == 1 ? UIImage(named: "icon_asc"):UIImage(named: "icon_desc"), for: .normal)
        viewModel.beginRefresh()
    }
 
    @IBAction func searchAction(_ sender: Any) {
        view.endEditing(true)
        viewModel.beginRefresh()
    }
}
 
extension SearchStoreListVC:UITextFieldDelegate{
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        view.endEditing(true)
        viewModel.beginRefresh()
        return true
    }
}
 
extension SearchStoreListVC:UITableViewDelegate{
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let model = viewModel.dataSource.value[indexPath.row]
        let vc = SearchStoreDetailVC(id: model.storeId)
        push(vc: vc)
    }
}
 
extension SearchStoreListVC:UITableViewDataSource{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = viewModel.dataSource.value[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "_SearchStoreTCell", for: indexPath) as! SearchStoreTCell
        cell.searchStoreListModel = model
        return cell
    }
 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSource.value.count 
    }
}