| | |
| | | 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_limits: QMUIButton! |
| | | @IBOutlet weak var tableView: UITableView! |
| | | @IBOutlet weak var stackView: UIStackView! |
| | | private var id:Int! |
| | | @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.spacingBetweenImageAndTitle = 10 |
| | | |
| | | btn_distance.imagePosition = .right |
| | | btn_distance.spacingBetweenImageAndTitle = -5 |
| | | btn_distance.spacingBetweenImageAndTitle = 6 |
| | | |
| | | btn_limits.imagePosition = .left |
| | | btn_limits.spacingBetweenImageAndTitle = 2 |
| | |
| | | tableView.dataSource = self |
| | | tableView.separatorStyle = .none |
| | | tableView.register(UINib(nibName: "SearchStoreTCell", bundle: nil), forCellReuseIdentifier: "_SearchStoreTCell") |
| | | |
| | | tf_searchStore.delegate = self |
| | | tf_searchStore.returnKeyType = .search |
| | | } |
| | | |
| | | init(id:Int) { |
| | | super.init(nibName: nil, bundle: nil) |
| | | self.id = id |
| | | override func setRx() { |
| | | tf_searchStore.rx.text.orEmpty.bind(to: viewModel.search).disposed(by: disposeBag) |
| | | } |
| | | |
| | | required init?(coder: NSCoder) { |
| | | fatalError("init(coder:) has not been implemented") |
| | | |
| | | @IBAction func gotoSettingAction(_ sender: QMUIButton) { |
| | | JQ_AuthorizesTool.default.openURL(.location) |
| | | } |
| | | |
| | | @IBAction func cityAction(_ sender: QMUIButton) { |
| | | guard !sender.isSelected else {return} |
| | | sender.isSelected = true |
| | | let items = Array<NormalSimpleModel>() |
| | | CourseSubTypeView.show(inView: self.view, afterView: stackView, items:items) { m in |
| | | sender.isSelected = false |
| | | |
| | | } closeClouse: { |
| | | sender.isSelected = false |
| | | } |
| | | 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 vc = SearchStoreDetailVC(id: 0) |
| | | 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 10 |
| | | return viewModel.dataSource.value.count |
| | | } |
| | | |
| | | |
| | | } |