WanPai/Common/TCell/CommonSingleTCell.swift
@@ -9,6 +9,10 @@ class CommonSingleTCell: UITableViewCell { @IBOutlet weak var label_title: UILabel! @IBOutlet weak var img_select: UIImageView! @IBOutlet weak var view_container: UIView! override func awakeFromNib() { super.awakeFromNib() selectionStyle = .none WanPai/Common/TCell/CommonSingleTCell.xib
@@ -59,6 +59,11 @@ </constraints> </tableViewCellContentView> <viewLayoutGuide key="safeArea" id="njF-e1-oar"/> <connections> <outlet property="img_select" destination="hYy-vZ-8P5" id="Fqn-ZO-5bb"/> <outlet property="label_title" destination="gbv-KA-MVi" id="EgY-b4-2FU"/> <outlet property="view_container" destination="fHS-Ci-ihh" id="ASq-WT-0GK"/> </connections> <point key="canvasLocation" x="203.0534351145038" y="41.901408450704224"/> </tableViewCell> </objects> WanPai/Config/Enums.swift
@@ -208,4 +208,14 @@ case over = 3 /// 已取消 case cancel = 4 var rawTitle:String{ switch self { case .all:return "" case .prepare:return "未开始" case .ongoing:return "进行中" case .over:return "已结束" case .cancel:return "已取消" } } } WanPai/Model/CommonModels.swift
@@ -99,10 +99,52 @@ var name: String = "" var registerCondition:RegisterAcitivyType = .allUser var registerEndTime: String = "" var status:SignupType = .all } struct ActivityDetailModel:HandyJSON{ var address: String = "" var age: String = "" ///是否报名 var apply:Int = 0 var city: String = "" var distance: Double = 0 var endTime: String = "" var id: Int = 0 var imgs: String = "" var introduction: String = "" var name: String = "" var participant = [ActivityDetailPartModel]() var payType: PayType = .aliPay var cashPrice: Double = 0 var classPrice:Int = 0 var playPaiCoin:Int = 0 var province: String = "" var registerCondition:RegisterAcitivyType = .allUser var registerEndTime: String = "" var registrationNotes: String = "" var startTime: String = "" var status: SignupType = .all var storeAddress: String = "" var storeCoverDrawing: String = "" var storeLat: String = "" var storeLon: String = "" var storeName: String = "" } struct ActivityDetailPartModel:HandyJSON{ var age = 0 var id = 0 var idcard = "" var name = "" var residueClassHour = 0 var phone = "" } struct CityProfileModel:HandyJSON { var id = 0 var code = "" var name = "" } WanPai/Network/Services.swift
@@ -12,7 +12,7 @@ import JQTools #if DEBUG let All_Url = "http://192.168.110.80:5209" let All_Url = "https://console-mock.apipost.cn/mock/b5b2dee0-5564-40ae-f082-a352d502a153" #else let All_Url = "http://192.168.110.80:5209" #endif @@ -186,7 +186,7 @@ extension Services{ /// 获取赛事列表 class func queryCompetitionList(cityCode:Int?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{ class func queryCompetitionList(cityCode:String?,content:String?,heat:SortType?,registerCondition:Int?)->Observable<BaseResponse<[ActivityListModel]>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "/competition/base/competition/queryCompetitionList") .append(key: "cityCode", value: cityCode) @@ -197,7 +197,7 @@ } /// 获取赛事详情 class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<SimpleModel>>{ class func queryCompetitionDetail(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "/competition/base/competition/queryCompetitionInfo") .append(key: "id", value: id) @@ -213,15 +213,74 @@ .append(key: "pageNo", value: page) .append(key: "pageSize", value: pageSize) .append(key: "type", value: type.rawValue) return NetworkRequest.request(params: params, method: .post, progress: false) } /// 获取参赛人员列表 class func queryParticipantList()->Observable<BaseResponse<[ActivityDetailPartModel]>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/participant/queryParticipantList") return NetworkRequest.request(params: params, method: .post, progress: false) } /// 编辑参赛人员信息 class func editParticipant(id:Int,height:Int,weight:Int,phone:String?)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/participant/editParticipant") return NetworkRequest.request(params: params, method: .post, progress: true) } ///获取所有开通城市 class func queryAllCity()->Observable<BaseResponse<String>>{ /// 添加参赛人员 class func addParticipant(_ model:StudentProfileModel)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "other/base/store/queryAllCity") .interface(url: "competition/api/participant/addParticipant") .append(key: "birthday", value: model.birthday) .append(key: "headImg", value: model.headImg) .append(key: "height", value: model.height.string) .append(key: "idCard", value: model.idCard) .append(key: "name", value: model.name) .append(key: "phone", value: model.phone) .append(key: "sex", value: model.sex.rawValue) .append(key: "weight", value: model.weight.string) return NetworkRequest.request(params: params, method: .post, progress: true) } /// 删除参赛人员 class func deleParticipant(id:Int)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/participant/delParticipant") .append(key: "id", value: id) return NetworkRequest.request(params: params, method: .post, progress: true) } /// 赛事报名 class func paymentCompetition(id:Int,userIds:String,payType:PayType)->Observable<BaseResponse<PaymentModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/competition/paymentCompetition") .append(key: "id", value: id) .append(key: "userIds", value: userIds) .append(key: "payType", value: payType.rawValue) return NetworkRequest.request(params: params, method: .post, progress: true) } /// 查询已报名赛事详情 class func queryMyCompetitionInfo(id:Int)->Observable<BaseResponse<ActivityDetailModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/competition/queryMyCompetitionInfo") .append(key: "id", value: id) return NetworkRequest.request(params: params, method: .post, progress: true) } /// 取消当前报名 class func cancelMyCOmpetition(id:Int)->Observable<BaseResponse<SimpleModel>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "competition/api/competition/cancelMyCompetition") .append(key: "id", value: id) return NetworkRequest.request(params: params, method: .post, progress: true) } } // MARK: -- 其他 @@ -258,10 +317,18 @@ /// 获取城市code获取门店 class func queryStoreAtCity(cityCode:String)->Observable<BaseResponse<[CityProfileModel]>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "/other//base/store/queryStoreByCityCode") .interface(url: "/other/base/store/queryStoreByCityCode") .append(key: "cityCode", value: cityCode) return NetworkRequest.request(params: params, method: .post, progress: true) } /// 获取全部城市 class func queryAllCity()->Observable<BaseResponse<[CityProfileModel]>>{ let params = ParamsAppender.build(url: All_Url) .interface(url: "/other/base/store/queryAllCity") return NetworkRequest.request(params: params, method: .post, progress: true) } } extension Services{ WanPai/Root/Activity/TCell/ActivityInfoTCell.swift
@@ -25,6 +25,14 @@ label_duetime.text = "截止报名:" + m.registerEndTime label_ageScope.text = m.age label_hot.text = "\(m.heat)" label_state.text = m.status.rawTitle switch m.status{ case .ongoing,.prepare: label_state.backgroundColor = Def_ThemeColor default: label_state.backgroundColor = UIColor(hexStr: "#BABABA") } } } } WanPai/Root/Activity/VC/ActivityDetailApplyVC.swift
@@ -7,16 +7,67 @@ import UIKit import QMUIKit import SDWebImage import JQTools class ActivityDetailApplyVC: BaseVC { @IBOutlet weak var img_profile: UIImageView! @IBOutlet weak var label_storeName: UILabel! @IBOutlet weak var label_title: UILabel! @IBOutlet weak var label_joinCondition: UILabel! @IBOutlet weak var label_address: UILabel! @IBOutlet weak var label_duetime: UILabel! @IBOutlet weak var label_starttime: UILabel! @IBOutlet weak var label_endtime: UILabel! @IBOutlet weak var label_ageScope: UILabel! @IBOutlet weak var label_city: UILabel! @IBOutlet weak var label_money: UILabel! @IBOutlet weak var label_coin: UILabel! @IBOutlet weak var label_courseNum: UILabel! @IBOutlet weak var label_introducion: UILabel! @IBOutlet weak var btn_enroll: UIButton! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var btn_addStudent: QMUIButton! @IBOutlet weak var cons_tableHei: NSLayoutConstraint! var activityDetailModel:ActivityDetailModel! private var students = [ActivityDetailPartModel]() required init(model:ActivityDetailModel) { super.init(nibName: nil, bundle: nil) self.activityDetailModel = model } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() title = "活动详情" img_profile.sd_setImage(with: URL(string: activityDetailModel.storeCoverDrawing)!) label_storeName.text = activityDetailModel.storeName + "(\(activityDetailModel.storeAddress))" label_title.text = activityDetailModel.name label_joinCondition.text = activityDetailModel.registerCondition.strTitle label_address.text = activityDetailModel.address label_duetime.text = activityDetailModel.registerEndTime label_starttime.text = activityDetailModel.startTime label_endtime.text = activityDetailModel.endTime label_ageScope.text = activityDetailModel.age label_introducion.text = activityDetailModel.introduction label_city.text = activityDetailModel.province + "|" + activityDetailModel.city label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency()) label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin) label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice) students.append(contentsOf: activityDetailModel.participant) cons_tableHei.constant = Double(students.count) * 100 tableView.reloadData() } override func setUI() { @@ -28,8 +79,10 @@ } @IBAction func addStudentAction(_ sender: QMUIButton) { StudentChooseView.show(itemType: .activity) { studs in StudentChooseView.show(itemType: .activity, defaultStu: students) { [weak self] studs in self?.students = studs as! [ActivityDetailPartModel] self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100 self?.tableView.reloadData() } needAddClouse: {[weak self] () in let vc = ActivityStudentListVC() self?.push(vc: vc) @@ -38,20 +91,51 @@ @IBAction func applyAction(_ sender: UIButton) { StoresInfoView.show(CourseDetailModel()) { status in guard students.count != 0 else { alertError(msg: "请至少选择一位参赛人员");return } // StoresInfoView.show(CourseDetailModel() { status in // if status{ // PaymentView.show(money: (ali:1,wx:2,coin:2,course:2)) { stat in // let result:PaymentResultVC.PaymentResult = status ? .success:.fail // let vc = PaymentResultVC(result: result, objType: .activityApply) // vc.modalPresentationStyle = .fullScreen // self.present(vc, animated: true) // } // } // } StoresInfoView.show(activityDetailModel) { [weak self] status in guard let weakSelf = self else { return } let price = weakSelf.activityDetailModel.cashPrice * Double(weakSelf.activityDetailModel.participant.count) let coin = weakSelf.activityDetailModel.playPaiCoin * weakSelf.activityDetailModel.participant.count let course = weakSelf.activityDetailModel.classPrice * weakSelf.activityDetailModel.participant.count if status{ PaymentView.show(money: (ali:price,wx:price,coin:coin,course:course)) { [weak self] type in guard let weakSelf = self else { return } let ids = weakSelf.students.map({"\($0.id)"}).joined(separator: ",") Services.paymentCompetition(id: weakSelf.activityDetailModel.id, userIds: ids, payType: type).subscribe(onNext: {data in if let m = data.data{ switch type { case .aliPay: let req = YYAlipayRequest(orderString: m.orderString) YYPaymentManager.shared.sendPaymentRequest(req) { result in switch result { case .success: let vc = PaymentResultVC(result: .success, objType: .activityApply) vc.modalPresentationStyle = .fullScreen weakSelf.present(vc, animated: true) case .cancel: let vc = PaymentResultVC(result: .fail, objType: .activityApply) vc.modalPresentationStyle = .fullScreen weakSelf.present(vc, animated: true) case .failure(_): let vc = PaymentResultVC(result: .fail, objType: .activityApply) vc.modalPresentationStyle = .fullScreen weakSelf.present(vc, animated: true) } } case .wechat:break case .coin:break case .courseNum:break } } }).disposed(by: weakSelf.disposeBag) } } } } } @@ -61,13 +145,25 @@ extension ActivityDetailApplyVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let student = students[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell cell.indexPath = indexPath cell.activityDetailPartModel = student cell.btn_edit.isHidden = true cell.img_radio.isHidden = true cell.delClouse = {[weak self] index in tableView.beginUpdates() self?.students.remove(at: index.row) tableView.deleteItemsAtIndexPaths([index], animationStyle: .automatic) tableView.endUpdates() tableView.reloadData() self?.cons_tableHei.constant = Double(self?.students.count ?? 0) * 100 } return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2 return students.count } } WanPai/Root/Activity/VC/ActivityDetailApplyVC.xib
@@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="retina6_12" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/> <capability name="Named colors" minToolsVersion="9.0"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> @@ -13,7 +13,22 @@ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivityDetailApplyVC" customModule="WanPai" customModuleProvider="target"> <connections> <outlet property="btn_addStudent" destination="vFF-I7-FyB" id="mwi-Hb-JXm"/> <outlet property="btn_enroll" destination="V8a-fY-mQH" id="UGV-vA-sh2"/> <outlet property="cons_tableHei" destination="E7r-ch-NFQ" id="292-df-rws"/> <outlet property="img_profile" destination="8p4-kz-QQR" id="Vr2-gO-BRG"/> <outlet property="label_address" destination="w7l-Hs-7EQ" id="LdO-Sd-ibK"/> <outlet property="label_ageScope" destination="RkB-65-NBj" id="v0f-KQ-KRu"/> <outlet property="label_city" destination="gQe-UF-wHC" id="wu9-wX-bZd"/> <outlet property="label_coin" destination="D5t-1x-WAG" id="Op0-h9-O57"/> <outlet property="label_courseNum" destination="G8f-PQ-0Pj" id="lno-Ng-8JU"/> <outlet property="label_duetime" destination="yFh-cd-Oew" id="jnZ-cU-xIo"/> <outlet property="label_endtime" destination="WG0-AL-bqm" id="8RG-ZV-h3p"/> <outlet property="label_introducion" destination="zOi-jz-xW4" id="yYQ-Lg-HWl"/> <outlet property="label_joinCondition" destination="2Bd-9P-C67" id="WUY-Bk-NuQ"/> <outlet property="label_money" destination="eU8-vW-wfW" id="mZ1-dy-Jx6"/> <outlet property="label_starttime" destination="HVZ-gK-GRY" id="PVB-dL-Xli"/> <outlet property="label_storeName" destination="fFg-Kg-NdR" id="Vh6-y3-NQp"/> <outlet property="label_title" destination="Mnc-lb-0cc" id="1SY-Nz-XIn"/> <outlet property="tableView" destination="UEA-WV-jZV" id="exc-tP-CQA"/> <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> </connections> @@ -568,7 +583,7 @@ <image name="btn_add_1" width="16" height="16"/> <image name="icon_local_mini" width="11" height="16"/> <namedColor name="FE6E0D"> <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </namedColor> <systemColor name="systemBackgroundColor"> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> WanPai/Root/Activity/VC/ActivityDetailVC.swift
@@ -6,9 +6,65 @@ // import UIKit import SDWebImage import JQTools class ActivityDetailVC: BaseVC { private var id:Int! @IBOutlet weak var img_profile: UIImageView! @IBOutlet weak var label_storeName: UILabel! @IBOutlet weak var label_title: UILabel! @IBOutlet weak var label_joinCondition: UILabel! @IBOutlet weak var label_address: UILabel! @IBOutlet weak var label_duetime: UILabel! @IBOutlet weak var label_starttime: UILabel! @IBOutlet weak var label_endtime: UILabel! @IBOutlet weak var label_ageScope: UILabel! @IBOutlet weak var label_city: UILabel! @IBOutlet weak var label_money: UILabel! @IBOutlet weak var label_coin: UILabel! @IBOutlet weak var label_courseNum: UILabel! @IBOutlet weak var label_introducion: UILabel! @IBOutlet weak var img_enrollRequired: UIImageView! @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint! @IBOutlet weak var btn_enroll: UIButton! var activityDetailModel:ActivityDetailModel!{ didSet{ img_profile.sd_setImage(with: URL(string: activityDetailModel.storeCoverDrawing)!) label_storeName.text = activityDetailModel.storeName + "(\(activityDetailModel.storeAddress))" label_title.text = activityDetailModel.name label_joinCondition.text = activityDetailModel.registerCondition.strTitle label_address.text = activityDetailModel.address label_duetime.text = activityDetailModel.registerEndTime label_starttime.text = activityDetailModel.startTime label_endtime.text = activityDetailModel.endTime label_ageScope.text = activityDetailModel.age label_introducion.text = activityDetailModel.introduction label_city.text = activityDetailModel.province + "|" + activityDetailModel.city SDWebImageDownloader.shared.downloadImage(with: URL(string: activityDetailModel.registrationNotes)!) {[weak self] image, data, error, status in guard let img = image else { self?.cons_imgEnrollHei.constant = 0;return } let radio = img.size.width / img.size.height self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW } label_money.text = String(format: "%@/人", activityDetailModel.cashPrice.currency()) label_coin.text = String(format: "%ld币/人", activityDetailModel.playPaiCoin) label_courseNum.text = String(format: "%ld课时/人", activityDetailModel.classPrice) let name = activityDetailModel.apply == 1 ? "已报名":"立即报名" let color = activityDetailModel.apply == 1 ? UIColor.gray.withAlphaComponent(0.5):Def_ThemeColor btn_enroll.setTitle(name, for: .normal) btn_enroll.backgroundColor = color } } required init(id:Int) { @@ -24,13 +80,16 @@ super.viewDidLoad() title = "活动详情" Services.queryCompetitionDetail(id: id).subscribe(onNext: {data in Services.queryCompetitionDetail(id: id).subscribe(onNext: {[weak self] data in if let data = data.data{ self?.activityDetailModel = data } }).disposed(by: disposeBag) } @IBAction func joinAction(_ sender: UIButton) { let vc = ActivityDetailApplyVC() guard activityDetailModel.apply == 0 else {return} let vc = ActivityDetailApplyVC(model: activityDetailModel) push(vc: vc) } } WanPai/Root/Activity/VC/ActivityDetailVC.xib
@@ -12,6 +12,23 @@ <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivityDetailVC" customModule="WanPai" customModuleProvider="target"> <connections> <outlet property="btn_enroll" destination="lNv-6h-9fm" id="1jA-V7-JGL"/> <outlet property="cons_imgEnrollHei" destination="cJz-gp-mRM" id="VWo-7z-5pw"/> <outlet property="img_enrollRequired" destination="c7G-7A-ePH" id="juI-hw-hEe"/> <outlet property="img_profile" destination="tHB-vU-AiW" id="X08-8x-bwm"/> <outlet property="label_address" destination="bbY-Kb-C5z" id="WcD-uY-098"/> <outlet property="label_ageScope" destination="qcG-AF-9Uh" id="1hS-Wj-Jym"/> <outlet property="label_city" destination="NBi-eH-iIS" id="NtM-vD-ivy"/> <outlet property="label_coin" destination="PY6-ve-vcQ" id="odv-df-2Os"/> <outlet property="label_courseNum" destination="RUi-U1-Ge0" id="qHg-ZV-law"/> <outlet property="label_duetime" destination="nPn-v2-ONf" id="ttv-gw-KKD"/> <outlet property="label_endtime" destination="kah-57-uD0" id="Cd8-8B-6hA"/> <outlet property="label_introducion" destination="BXI-8J-fD0" id="2sv-GS-XdT"/> <outlet property="label_joinCondition" destination="0xj-gh-rFl" id="cSI-pz-OGJ"/> <outlet property="label_money" destination="Jlz-7i-loh" id="tla-wb-Edb"/> <outlet property="label_starttime" destination="hmj-Je-tPz" id="rA5-Ut-KQL"/> <outlet property="label_storeName" destination="l5e-Xg-fHb" id="wFX-gB-Ijt"/> <outlet property="label_title" destination="uIe-np-Pwt" id="MHn-gz-rST"/> <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> </connections> </placeholder> WanPai/Root/Activity/VC/ActivityListVC.swift
@@ -12,13 +12,13 @@ class ActivityListViewModel:RefreshModel<ActivityListModel>{ var city = BehaviorRelay<Int?>(value:nil) var cityCode = BehaviorRelay<String?>(value:nil) var content = BehaviorRelay<String>(value: "") var heat = BehaviorRelay<SortType?>(value:nil) var registerCondition = BehaviorRelay<RegisterAcitivyType?>(value:nil) override func api() -> (Observable<BaseResponse<[ActivityListModel]>>)? { return Services.queryCompetitionList(cityCode: city.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue) return Services.queryCompetitionList(cityCode: cityCode.value, content: content.value, heat: heat.value, registerCondition: registerCondition.value?.rawValue) } } @@ -73,8 +73,10 @@ guard !sender.isSelected else {return} hiddenMenu() sender.isSelected = true cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { text in sender.setTitle(text, for: .normal) cityChooseSubTypeView = CityChooseSubTypeView.show(inView: self.view, afterView: view_top) { [weak self] m in sender.setTitle(m.name, for: .normal) self?.viewModel.cityCode.accept(m.code) self?.viewModel.beginRefresh() sender.isSelected = false } closeClouse: { sender.isSelected = false @@ -133,6 +135,7 @@ let model = viewModel.dataSource.value[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell cell.activityListModel = model cell.label_state.isHidden = true return cell } WanPai/Root/Activity/VC/ActivitySignupDetailVC.swift
@@ -6,19 +6,140 @@ // import UIKit import SDWebImage import JQTools let CancelActivitySingup_Noti = Notification.Name.init("CancelActivitySingup_Noti") class ActivitySignupDetailVC: BaseVC { private var id:Int! @IBOutlet weak var img_profile: UIImageView! @IBOutlet weak var label_storeName: UILabel! @IBOutlet weak var label_title: UILabel! @IBOutlet weak var label_joinCondition: UILabel! @IBOutlet weak var label_address: UILabel! @IBOutlet weak var label_duetime: UILabel! @IBOutlet weak var label_starttime: UILabel! @IBOutlet weak var label_endtime: UILabel! @IBOutlet weak var label_ageScope: UILabel! @IBOutlet weak var label_city: UILabel! @IBOutlet weak var label_money: UILabel! @IBOutlet weak var label_totalMoney: UILabel! @IBOutlet weak var label_introducion: UILabel! @IBOutlet weak var img_enrollRequired: UIImageView! @IBOutlet weak var cons_imgEnrollHei: NSLayoutConstraint! @IBOutlet weak var btn_cancel: UIButton! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var cons_tableHei: NSLayoutConstraint! var activityDetailModel:ActivityDetailModel?{ didSet{ guard let m = activityDetailModel else {return} img_profile.sd_setImage(with: URL(string: m.storeCoverDrawing)!) label_storeName.text = m.storeName + "(\(m.storeAddress))" label_title.text = m.name label_joinCondition.text = m.registerCondition.strTitle label_address.text = m.address label_duetime.text = m.registerEndTime label_starttime.text = m.startTime label_endtime.text = m.endTime label_ageScope.text = m.age label_introducion.text = m.introduction label_city.text = m.province + "|" + m.city SDWebImageDownloader.shared.downloadImage(with: URL(string: m.registrationNotes)!) {[weak self] image, data, error, status in guard let img = image else { self?.cons_imgEnrollHei.constant = 0;return } let radio = img.size.width / img.size.height self?.cons_imgEnrollHei.constant = radio * JQ_ScreenW } if m.cashPrice != 0 { label_money.text = String(format: "%@/人", m.cashPrice.currency()) label_totalMoney.text = String(format: "合计:%@", (m.cashPrice * Double(m.participant.count)).currency()) } if m.playPaiCoin != 0{ label_money.text = String(format: "%ld币/人", m.playPaiCoin) label_totalMoney.text = String(format: "合计:%ld币", (m.playPaiCoin * m.participant.count)) } if m.classPrice != 0{ label_money.text = String(format: "%ld课时/人", m.classPrice) label_totalMoney.text = String(format: "合计:%ld课时", (m.classPrice * m.participant.count)) } cons_tableHei.constant = Double(m.participant.count) * 100 tableView.reloadData() } } required init(id: Int) { super.init(nibName: nil, bundle: nil) self.id = id } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() title = "活动详情" Services.queryMyCompetitionInfo(id: id).subscribe(onNext: {data in self.activityDetailModel = data.data }).disposed(by: disposeBag) } override func setUI() { tableView.delegate = self tableView.dataSource = self tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell") } @IBAction func operationAction(_ sender: UIButton) { CommonAlertView.show(title: "提示", content: "确认取消吗?取消后相关费用将会退还到原支付账户!") { _ in CommonAlertView.show(title: "提示", content: "确认取消吗?取消后相关费用将会退还到原支付账户!") { [weak self]status in guard let weakSelf = self else { return } if status{ Services.cancelMyCOmpetition(id: weakSelf.id).subscribe(onNext: { data in alertSuccess(msg: "取消成功") self?.btn_cancel.isHidden = true NotificationCenter.default.post(name: CancelActivitySingup_Noti, object: nil) }).disposed(by: weakSelf.disposeBag) } } } } extension ActivitySignupDetailVC:UITableViewDelegate{ } extension ActivitySignupDetailVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let student = activityDetailModel!.participant[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell cell.indexPath = indexPath cell.activityDetailPartModel = student cell.btn_edit.isHidden = true cell.img_radio.isHidden = true cell.btn_delete.isHidden = true return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return activityDetailModel?.participant.count ?? 0 } } WanPai/Root/Activity/VC/ActivitySignupDetailVC.xib
@@ -12,6 +12,24 @@ <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ActivitySignupDetailVC" customModule="WanPai" customModuleProvider="target"> <connections> <outlet property="btn_cancel" destination="gsK-Ti-c0V" id="Xio-78-QS4"/> <outlet property="cons_imgEnrollHei" destination="mAy-Ng-8UL" id="Aer-Cm-sMm"/> <outlet property="cons_tableHei" destination="yGd-8d-HGD" id="OTf-Vx-aXz"/> <outlet property="img_enrollRequired" destination="SpQ-0k-1EN" id="cRI-V5-kV6"/> <outlet property="img_profile" destination="eXP-qo-kfo" id="eWb-zf-u07"/> <outlet property="label_address" destination="XP0-t1-ig8" id="ofm-w5-G0F"/> <outlet property="label_ageScope" destination="kmf-XM-osN" id="RKf-8t-nz7"/> <outlet property="label_city" destination="lA2-Dx-e7N" id="zB2-4f-uaC"/> <outlet property="label_duetime" destination="XNr-7p-cOy" id="VvG-vn-si0"/> <outlet property="label_endtime" destination="N3e-2J-emq" id="lXK-RK-f2C"/> <outlet property="label_introducion" destination="3t5-6s-rAl" id="Z8D-ed-TOC"/> <outlet property="label_joinCondition" destination="i4P-8X-bJm" id="9nW-J5-c1j"/> <outlet property="label_money" destination="VtB-Xx-cFv" id="9r8-XO-jvy"/> <outlet property="label_starttime" destination="JzL-bl-dVo" id="g1B-EF-6lO"/> <outlet property="label_storeName" destination="uoD-EG-EuC" id="uAF-6q-6Jm"/> <outlet property="label_title" destination="UMG-EM-0dd" id="4pY-yN-O3m"/> <outlet property="label_totalMoney" destination="ZUy-X0-BNd" id="Np0-sJ-5qT"/> <outlet property="tableView" destination="m6W-zh-Mvj" id="Trt-2g-HX6"/> <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> </connections> </placeholder> @@ -21,32 +39,32 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rym-cm-VUC"> <rect key="frame" x="0.0" y="59" width="377" height="759"/> <rect key="frame" x="0.0" y="59" width="393" height="759"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="u6Z-PS-k1D"> <rect key="frame" x="0.0" y="0.0" width="377" height="1204.6666666666667"/> <rect key="frame" x="0.0" y="0.0" width="393" height="1213.6666666666667"/> <subviews> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="eXP-qo-kfo"> <rect key="frame" x="0.0" y="0.0" width="377" height="211"/> <rect key="frame" x="0.0" y="0.0" width="393" height="220"/> <color key="backgroundColor" systemColor="systemGray6Color"/> <constraints> <constraint firstAttribute="width" secondItem="eXP-qo-kfo" secondAttribute="height" multiplier="1:0.56" id="OiP-Ee-oqZ"/> </constraints> </imageView> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="TUv-Fz-UHV"> <rect key="frame" x="0.0" y="210.99999999999994" width="377" height="993.66666666666652"/> <rect key="frame" x="0.0" y="219.99999999999994" width="393" height="993.66666666666652"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="edY-He-yWT"> <rect key="frame" x="0.0" y="0.0" width="377" height="235"/> <rect key="frame" x="0.0" y="0.0" width="393" height="235"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UMG-EM-0dd"> <rect key="frame" x="14" y="14" width="243" height="183.66666666666666"/> <rect key="frame" x="14" y="14" width="259" height="183.66666666666666"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> <view contentMode="scaleToFill" horizontalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="EOr-Ck-3py"> <rect key="frame" x="318" y="14" width="45" height="21"/> <rect key="frame" x="334" y="14" width="45" height="21"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="i4P-8X-bJm"> <rect key="frame" x="7" y="0.0" width="31" height="21"/> @@ -72,13 +90,13 @@ </constraints> </imageView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uoD-EG-EuC"> <rect key="frame" x="30" y="205.66666666666669" width="342" height="14.333333333333343"/> <rect key="frame" x="30" y="205.66666666666669" width="358" height="14.333333333333343"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="F8G-lx-1Z2"> <rect key="frame" x="14" y="234" width="363" height="1"/> <rect key="frame" x="14" y="234" width="379" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="djr-SK-nlX"/> @@ -109,10 +127,10 @@ </userDefinedRuntimeAttributes> </view> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="jgm-Kx-ReO"> <rect key="frame" x="0.0" y="235" width="377" height="230"/> <rect key="frame" x="0.0" y="235" width="393" height="230"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ReX-iz-v11"> <rect key="frame" x="0.0" y="0.0" width="377" height="46"/> <rect key="frame" x="0.0" y="0.0" width="393" height="46"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Eb-9r-932"> <rect key="frame" x="14" y="11" width="4" height="4"/> @@ -153,7 +171,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BLJ-lc-YEB"> <rect key="frame" x="0.0" y="46" width="377" height="46"/> <rect key="frame" x="0.0" y="46" width="393" height="46"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ltj-DL-lb4"> <rect key="frame" x="14" y="11" width="4" height="4"/> @@ -194,7 +212,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GpD-dt-0jE"> <rect key="frame" x="0.0" y="92" width="377" height="46"/> <rect key="frame" x="0.0" y="92" width="393" height="46"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="reL-36-mqI"> <rect key="frame" x="14" y="11" width="4" height="4"/> @@ -235,7 +253,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fKp-tk-BMZ"> <rect key="frame" x="0.0" y="138" width="377" height="46"/> <rect key="frame" x="0.0" y="138" width="393" height="46"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sp6-JJ-i7i"> <rect key="frame" x="14" y="11" width="4" height="4"/> @@ -276,7 +294,7 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a9Z-e0-RVA"> <rect key="frame" x="0.0" y="184" width="377" height="46"/> <rect key="frame" x="0.0" y="184" width="393" height="46"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9pI-Ea-HrZ"> <rect key="frame" x="14" y="11" width="4" height="4"/> @@ -305,7 +323,7 @@ <nil key="highlightedColor"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="--" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lA2-Dx-e7N"> <rect key="frame" x="351.33333333333331" y="28.333333333333368" width="11.666666666666686" height="14.333333333333332"/> <rect key="frame" x="367.33333333333331" y="28.333333333333368" width="11.666666666666686" height="14.333333333333332"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/> <nil key="textColor"/> <nil key="highlightedColor"/> @@ -327,10 +345,10 @@ </subviews> </stackView> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zJ5-21-kLx"> <rect key="frame" x="0.0" y="464.99999999999994" width="377" height="149.33333333333331"/> <rect key="frame" x="0.0" y="464.99999999999994" width="393" height="149.33333333333331"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="d2i-mV-pu5"> <rect key="frame" x="13" y="0.0" width="364" height="1"/> <rect key="frame" x="13" y="0.0" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="Wv2-vJ-x4Q"/> @@ -343,7 +361,7 @@ <nil key="highlightedColor"/> </label> <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="m6W-zh-Mvj"> <rect key="frame" x="0.0" y="49.333333333333371" width="377" height="100"/> <rect key="frame" x="0.0" y="49.333333333333371" width="393" height="100"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> <constraint firstAttribute="height" constant="100" id="yGd-8d-HGD"/> @@ -364,24 +382,24 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dan-qg-cLQ"> <rect key="frame" x="0.0" y="614.33333333333337" width="377" height="115"/> <rect key="frame" x="0.0" y="614.33333333333337" width="393" height="115"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ELv-4d-A6p"> <rect key="frame" x="13" y="0.0" width="364" height="1"/> <rect key="frame" x="13" y="0.0" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="tHh-mP-vh1"/> </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="t3L-i0-hQf"> <rect key="frame" x="13" y="114" width="364" height="1"/> <rect key="frame" x="13" y="114" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="bng-7M-THG"/> </constraints> </view> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事费用" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kAL-8h-2oA"> <rect key="frame" x="14" y="15" width="349" height="64"/> <rect key="frame" x="14" y="15" width="365" height="64"/> <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> <nil key="textColor"/> <nil key="highlightedColor"/> @@ -393,7 +411,7 @@ <nil key="highlightedColor"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="合计:¥0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZUy-X0-BNd"> <rect key="frame" x="302" y="91" width="61" height="17"/> <rect key="frame" x="318" y="91" width="61" height="17"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/> <color key="textColor" red="1" green="0.14509803921568626" blue="0.14509803921568626" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> @@ -418,30 +436,30 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5wv-LK-WEg"> <rect key="frame" x="0.0" y="729.33333333333337" width="377" height="115"/> <rect key="frame" x="0.0" y="729.33333333333337" width="393" height="115"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qxw-c2-zsl"> <rect key="frame" x="13" y="0.0" width="364" height="1"/> <rect key="frame" x="13" y="0.0" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="OY1-V6-dfy"/> </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gG3-fm-qze"> <rect key="frame" x="13" y="113.99999999999989" width="364" height="1"/> <rect key="frame" x="13" y="113.99999999999989" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="RKP-mR-awy"/> </constraints> </view> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赛事简介" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ieh-s0-lkb"> <rect key="frame" x="14" y="15" width="349" height="61"/> <rect key="frame" x="14" y="15" width="365" height="61"/> <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3t5-6s-rAl"> <rect key="frame" x="14" y="82.999999999999886" width="349" height="17"/> <rect key="frame" x="14" y="82.999999999999886" width="365" height="17"/> <fontDescription key="fontDescription" type="system" pointSize="14"/> <color key="textColor" red="0.23921568630000001" green="0.24313725489999999" blue="0.27058823529999998" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> @@ -465,23 +483,23 @@ </constraints> </view> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yFM-tU-dMy"> <rect key="frame" x="0.0" y="844.33333333333326" width="377" height="149.33333333333337"/> <rect key="frame" x="0.0" y="844.33333333333326" width="393" height="149.33333333333337"/> <subviews> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="53b-9u-D2e"> <rect key="frame" x="13" y="0.0" width="364" height="1"/> <rect key="frame" x="13" y="0.0" width="380" height="1"/> <color key="backgroundColor" red="0.59215686270000001" green="0.59215686270000001" blue="0.59215686270000001" alpha="0.22" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstAttribute="height" constant="1" id="Ngj-hn-htc"/> </constraints> </view> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名须知" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qEc-jv-Bpx"> <rect key="frame" x="14" y="14.999999999999998" width="349" height="19.333333333333329"/> <rect key="frame" x="14" y="14.999999999999998" width="365" height="19.333333333333329"/> <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> <nil key="textColor"/> <nil key="highlightedColor"/> </label> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="SpQ-0k-1EN"> <rect key="frame" x="0.0" y="49.333333333333485" width="377" height="100"/> <rect key="frame" x="0.0" y="49.333333333333485" width="393" height="100"/> <constraints> <constraint firstAttribute="height" constant="100" id="mAy-Ng-8UL"/> </constraints> @@ -542,8 +560,8 @@ <color key="backgroundColor" systemColor="systemBackgroundColor"/> <constraints> <constraint firstItem="Rym-cm-VUC" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="DEO-hE-CGp"/> <constraint firstAttribute="trailingMargin" secondItem="Rym-cm-VUC" secondAttribute="trailing" id="E0z-pn-c9M"/> <constraint firstItem="Rym-cm-VUC" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="Esp-Un-UGk"/> <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="Rym-cm-VUC" secondAttribute="trailing" id="Fvm-c8-sIL"/> <constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="gsK-Ti-c0V" secondAttribute="trailing" id="Rmn-g8-RNB"/> <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="Rym-cm-VUC" secondAttribute="bottom" id="Sij-mS-gac"/> <constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="gsK-Ti-c0V" secondAttribute="bottom" id="avU-oz-rD2"/> @@ -555,7 +573,7 @@ <resources> <image name="icon_local_mini" width="11" height="16"/> <namedColor name="FE6E0D"> <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </namedColor> <systemColor name="systemBackgroundColor"> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> WanPai/Root/Activity/VC/ActivitySignupListSubVC.swift
@@ -53,19 +53,27 @@ make.edges.equalToSuperview() } } override func setRx() { NotificationCenter.default.rx.notification(CancelActivitySingup_Noti).take(until: self.rx.deallocated).subscribe(onNext: {[weak self]noti in self?.viewModel.beginRefresh() }).disposed(by: disposeBag) } } extension ActivitySignupListSubVC:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let model = viewModel.dataSource.value[indexPath.row] let vc = ActivitySignupDetailVC() let vc = ActivitySignupDetailVC(id: model.id) push(vc: vc) } } extension ActivitySignupListSubVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let model = viewModel.dataSource.value[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_ActivityInfoTCell") as! ActivityInfoTCell cell.activityListModel = model return cell } WanPai/Root/Activity/VC/ActivityStudentListVC.swift
@@ -7,15 +7,28 @@ import UIKit import QMUIKit import JQTools import RxSwift import RxCocoa import HandyJSON class ActivityStudentViewModel:RefreshModel<ActivityDetailPartModel>{ override func api() -> (Observable<BaseResponse<[ActivityDetailPartModel]>>)? { return Services.queryParticipantList() } } class ActivityStudentListVC: BaseVC { @IBOutlet weak var btn_addStudent: QMUIButton! @IBOutlet weak var tableView: UITableView! private var viewModel = ActivityStudentViewModel() override func viewDidLoad() { super.viewDidLoad() title = "选择人员" viewModel.configure(tableView,needMore: false) viewModel.beginRefresh() } override func setUI() { @@ -27,9 +40,15 @@ tableView.separatorStyle = .none tableView.register(UINib(nibName: "StudentInfo_2_TCell", bundle: nil), forCellReuseIdentifier: "_StudentInfo_2_TCell") } override func setRx() { NotificationCenter.default.rx.notification(StudentUpdate_Nofi).take(until: self.rx.deallocated).subscribe(onNext: {[weak self] noti in self?.viewModel.beginRefresh() }).disposed(by: disposeBag) } @IBAction func addStudentAction(_ sender: Any) { let vc = AddStudentVC() let vc = AddStudentVC(type: .activity) push(vc: vc) } } @@ -41,11 +60,24 @@ extension ActivityStudentListVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell cell.indexPath = indexPath cell.img_radio.isHidden = true cell.activityDetailPartModel = viewModel.dataSource.value[indexPath.row] cell.delClouse = {index in CommonAlertView.show(title: "提示", content: "确认删除当前人员吗?") { [weak self] status in guard let weakSelf = self else { return } if status{ let m = weakSelf.viewModel.dataSource.value[index.row] Services.deleParticipant(id: m.id).subscribe(onNext: { data in weakSelf.viewModel.beginRefresh() }).disposed(by: weakSelf.disposeBag) } } } return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 return viewModel.dataSource.value.count } } WanPai/Root/Activity/View/StoresInfoView.swift
@@ -28,7 +28,7 @@ let storesView = StoresInfoView.jq_loadNibView() storesView.frame = screnDelegate?.window?.frame ?? .zero storesView.img_logo.sd_setImage(with: URL(string: detailModel.coverDrawing)!) storesView.img_logo.sd_setImage(with: URL(string: detailModel.coverDrawing)) storesView.label_title.text = detailModel.name storesView.label_address.text = detailModel.storeAddress storesView.label_distance.text = String(format: "距你%.2lfkm", detailModel.distance) @@ -40,6 +40,23 @@ storesView.alpha = 1 } } static func show(_ activityModel:ActivityDetailModel,clouse:@escaping (Bool)->Void){ let storesView = StoresInfoView.jq_loadNibView() storesView.frame = screnDelegate?.window?.frame ?? .zero storesView.img_logo.sd_setImage(with: URL(string: activityModel.storeCoverDrawing)) storesView.label_title.text = activityModel.name storesView.label_address.text = activityModel.storeAddress storesView.label_distance.text = String(format: "距你%.2lfkm", activityModel.distance) storesView.clouse = clouse screnDelegate?.window?.addSubview(storesView) UIView.animate(withDuration: 0.4) { storesView.view_container.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) storesView.alpha = 1 } } @IBAction func cancelAction(_ sender: UIButton) { close() WanPai/Root/Activity/View/StudentUpdateInfoView.swift
@@ -7,21 +7,51 @@ import UIKit import JQTools import QMUIKit import RxSwift let StudentUpdate_Nofi = Notification.Name.init("StudentUpdate_Nofi") class StudentUpdateInfoView: UIView,JQNibView{ @IBOutlet weak var view_container: UIView! @IBOutlet weak var cons_bottom: NSLayoutConstraint! @IBOutlet weak var tf_height: QMUITextField! @IBOutlet weak var tf_weight: QMUITextField! @IBOutlet weak var tf_phone: QMUITextField! private var model:ActivityDetailPartModel? private let disposeBag = DisposeBag() override func awakeFromNib() { super.awakeFromNib() cons_bottom.constant = -(JQ_ScreenW / 2) alpha = 0 layoutIfNeeded() NotificationCenter.default.rx.notification(UIApplication.keyboardWillHideNotification).subscribe(onNext: {noti in if let userInfo = noti.userInfo{ self.cons_bottom.constant = 0 let duration = (userInfo["UIKeyboardAnimationDurationUserInfoKey"] as? Double) ?? 0 UIView.animate(withDuration: duration) { self.layoutIfNeeded() } } }).disposed(by: disposeBag) NotificationCenter.default.rx.notification(UIApplication.keyboardWillShowNotification).subscribe(onNext: { noti in if let userInfo = noti.userInfo{ self.cons_bottom.constant = (userInfo["UIKeyboardFrameEndUserInfoKey"] as? CGRect)?.height ?? 0 let duration = (userInfo["UIKeyboardAnimationDurationUserInfoKey"] as? Double) ?? 0 UIView.animate(withDuration: duration) { self.layoutIfNeeded() } } }).disposed(by: disposeBag) } static func show(){ static func show(_ model:ActivityDetailPartModel){ let storesView = StudentUpdateInfoView.jq_loadNibView() storesView.model = model storesView.frame = screnDelegate?.window?.frame ?? .zero screnDelegate?.window?.addSubview(storesView) storesView.cons_bottom.constant = 0 @@ -31,6 +61,30 @@ storesView.layoutIfNeeded() } } @IBAction func saveAction(_ sender: UIButton) { guard !tf_height.text!.isEmpty else {alertError(msg: "请输入身高");return} guard !tf_weight.text!.isEmpty else {alertError(msg: "请输入体重");return} guard tf_height.text!.int != 0 else {alertError(msg: "请输入正确的身高");return} guard tf_weight.text!.int != 0 else {alertError(msg: "请输入正确的体重");return} self.endEditing(true) Services.editParticipant(id: model!.id, height: tf_height.text!.int!, weight: tf_weight.text!.int!, phone: tf_phone.text).subscribe(onNext: {data in alertSuccess(msg: "修改成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) { NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil) self.close() } }).disposed(by: disposeBag) } @IBAction func closeAction(_ sender: UIButton) { close() } private func close(){ self.cons_bottom.constant = -(JQ_ScreenW / 2) WanPai/Root/Activity/View/StudentUpdateInfoView.xib
@@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="retina6_12" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/> <capability name="Named colors" minToolsVersion="9.0"/> <capability name="System colors in document resources" minToolsVersion="11.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> @@ -193,6 +193,9 @@ <real key="value" value="1"/> </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> <connections> <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="vFi-xq-qyL"/> </connections> </button> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pdv-hP-j5u"> <rect key="frame" x="207" y="192.33333333333337" width="146" height="40"/> @@ -210,6 +213,9 @@ <real key="value" value="20"/> </userDefinedRuntimeAttribute> </userDefinedRuntimeAttributes> <connections> <action selector="saveAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="VMo-41-mds"/> </connections> </button> </subviews> <color key="backgroundColor" systemColor="systemBackgroundColor"/> @@ -226,15 +232,29 @@ <constraint firstAttribute="trailing" secondItem="V13-39-Dea" secondAttribute="trailing" id="pI5-DU-DUG"/> </constraints> </view> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZAh-4X-KgY"> <rect key="frame" x="0.0" y="0.0" width="393" height="560.66666666666663"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <connections> <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="HHa-Qh-d4t"/> </connections> </button> </subviews> <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/> <constraints> <constraint firstItem="ZAh-4X-KgY" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="3hB-2M-dCz"/> <constraint firstAttribute="trailing" secondItem="ZAh-4X-KgY" secondAttribute="trailing" id="H19-1B-OUy"/> <constraint firstItem="ZAh-4X-KgY" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="SgX-gc-8zU"/> <constraint firstAttribute="bottom" secondItem="FQP-Da-djy" secondAttribute="bottom" id="Xfr-Bp-8jB"/> <constraint firstItem="FQP-Da-djy" firstAttribute="top" secondItem="ZAh-4X-KgY" secondAttribute="bottom" id="Zk1-2K-JHo"/> <constraint firstItem="FQP-Da-djy" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="c0g-Sn-Fvg"/> <constraint firstAttribute="trailing" secondItem="FQP-Da-djy" secondAttribute="trailing" id="pRf-XY-SYk"/> </constraints> <connections> <outlet property="cons_bottom" destination="Xfr-Bp-8jB" id="IZH-JX-BFj"/> <outlet property="tf_height" destination="Zec-I5-pJT" id="48c-gi-8K9"/> <outlet property="tf_phone" destination="Cui-v0-oxz" id="Twv-bl-sNA"/> <outlet property="tf_weight" destination="U4X-od-m4c" id="3R1-09-4pq"/> <outlet property="view_container" destination="FQP-Da-djy" id="v8l-GZ-ns8"/> </connections> <point key="canvasLocation" x="-10" y="21"/> @@ -243,7 +263,7 @@ <resources> <image name="icon_item_p" width="12" height="12"/> <namedColor name="FE6E0D"> <color red="0.99599999189376831" green="0.4309999942779541" blue="0.050999999046325684" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color red="0.99199998378753662" green="0.53299999237060547" blue="0.0080000003799796104" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </namedColor> <systemColor name="systemBackgroundColor"> <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> WanPai/Root/Course/VC/AddStudentVC.swift
@@ -24,11 +24,26 @@ var studentModel = StudentProfileModel() var type:ItemType! var verifyIdCard:Bool = false init(type:ItemType) { super.init(nibName: nil, bundle: nil) self.type = type } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() title = "添加学员" if type == .course{ title = "添加学员" }else{ title = "添加人员" } let idCardView = IDCardView() idCardView.box.bind { text in @@ -80,8 +95,8 @@ studentModel.name = tf_name.text! studentModel.height = tf_height.text!.toDouble studentModel.weight = tf_weight.text!.toDouble studentModel.phone = tf_phone.text studentModel.idCard = tf_idCard.text studentModel.phone = tf_phone.text! studentModel.idCard = tf_idCard.text! studentModel.name = tf_name.text! if studentModel.headImg.isEmpty{ @@ -101,13 +116,25 @@ } private func addStudent(){ Services.addStudent(studentModel).subscribe(onNext: { [weak self] data in guard let weakSelf = self else { return } alertSuccess(msg: "添加成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) { weakSelf.navigationController?.popViewController() } }).disposed(by: disposeBag) if type == .course{ Services.addStudent(studentModel).subscribe(onNext: { [weak self] data in guard let weakSelf = self else { return } alertSuccess(msg: "添加成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) { weakSelf.navigationController?.popViewController() } }).disposed(by: disposeBag) }else{ Services.addParticipant(studentModel).subscribe(onNext: {[weak self] data in guard let weakSelf = self else { return } alertSuccess(msg: "添加成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) { weakSelf.navigationController?.popViewController() NotificationCenter.default.post(name: StudentUpdate_Nofi, object: nil) } }).disposed(by: disposeBag) } } deinit{ WanPai/Root/Course/VC/CourseDetailApplyVC.swift
@@ -108,12 +108,12 @@ @IBAction func studentAction(_ sender: QMUIButton) { StudentChooseView.show(itemType: .course, defaultStu: studentModels) { [weak self] studs in guard let weakSelf = self else { return } weakSelf.studentModels = studs weakSelf.studentModels = studs as! [CourseDetailStudentModel] weakSelf.tableView.reloadData() weakSelf.cons_tableHei.constant = CGFloat((weakSelf.studentModels.count) * 87) weakSelf.changePrice(weakSelf.selectClassIndex) } needAddClouse: { [weak self] () in let vc = AddStudentVC() let vc = AddStudentVC(type: .course) self?.push(vc: vc) } } WanPai/Root/Course/VC/CourseInfoVC.swift
@@ -164,7 +164,7 @@ } @objc func addStudentAction() { let vc = AddStudentVC() let vc = AddStudentVC(type: .course) push(vc: vc) } WanPai/Root/Course/VC/CourseVC.swift
@@ -34,7 +34,7 @@ @IBAction func addStudentAction(_ sender: QMUIButton) { let addstudentVC = AddStudentVC() let addstudentVC = AddStudentVC(type: .course) push(vc: addstudentVC) } } WanPai/Root/Course/VC/StudentExchangeVC.swift
@@ -24,7 +24,7 @@ } @IBAction func addStudentAction(_ sender: UIButton) { let studentVC = AddStudentVC() let studentVC = AddStudentVC(type: .course) push(vc: studentVC) } } WanPai/Root/Course/View/CityChooseSubTypeView.swift
@@ -1,29 +1,54 @@ // // CityChooseSubTypeView.swift // WanPai // // Created by 杨锴 on 2023/6/13. // // // CityChooseSubTypeView.swift // WanPai // // Created by 杨锴 on 2023/6/13. // import UIKit import JQTools import RxSwift class CityChooseSubTypeView: UIView,JQNibView{ @IBOutlet weak var cons_viewHeight: NSLayoutConstraint! @IBOutlet weak var label_city: UILabel! @IBOutlet weak var tableView: UITableView! private var closeClouse:(()->Void)? private var clouse:((String)->Void)? private var clouse:((CityProfileModel)->Void)? private var disposeBag = DisposeBag() private var datas = [CityProfileModel]() private var dataDict = Dictionary<String,[CityProfileModel]>() private var keys = [String]() override func awakeFromNib() { super.awakeFromNib() cons_viewHeight.constant = 100 alpha = 0 layoutIfNeeded() tableView.delegate = self tableView.dataSource = self tableView.sectionIndexColor = Def_ThemeColor tableView.register(UINib(nibName: "CommonSingleTCell", bundle: nil), forCellReuseIdentifier: "_CommonSingleTCell") startLocation() Services.queryAllCity().subscribe(onNext: {[weak self] data in if let models = data.data{ self?.datas = models for v in models{ if let py = v.name.jq_getPinyin().first?.uppercased(){ if self?.dataDict[py] == nil{ self?.dataDict[py] = [CityProfileModel]() } self?.dataDict[py]?.append(v) } } self?.keys = self?.dataDict.keys.sorted() ?? [] self?.tableView.reloadData() } }).disposed(by: disposeBag) } @discardableResult static func show(inView:UIView,afterView:UIView,clouse:@escaping (String)->Void,closeClouse:@escaping ()->Void)->CityChooseSubTypeView{ static func show(inView:UIView,afterView:UIView,clouse:@escaping (CityProfileModel)->Void,closeClouse:@escaping ()->Void)->CityChooseSubTypeView{ let subTypeView = CityChooseSubTypeView.jq_loadNibView() subTypeView.closeClouse = closeClouse subTypeView.clouse = clouse @@ -71,3 +96,64 @@ startLocation() } } extension CityChooseSubTypeView:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let key = keys[indexPath.section] let model = dataDict[key]![indexPath.row] clouse!(model) self.cons_viewHeight.constant = 100 UIView.animate(withDuration: 0.2) { self.alpha = 0 self.layoutIfNeeded() } completion: { _ in self.removeFromSuperview() } } } extension CityChooseSubTypeView:UITableViewDataSource{ func sectionIndexTitles(for tableView: UITableView) -> [String]? { return keys } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return keys[section] } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 35 } func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { return index } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 46 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "_CommonSingleTCell") as! CommonSingleTCell if let model = dataDict[keys[indexPath.section]]?[indexPath.row]{ cell.label_title.text = model.name } cell.img_select.isHidden = true cell.view_container.borderColor = .clear cell.view_container.backgroundColor = .white return cell } func numberOfSections(in tableView: UITableView) -> Int { return keys.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return dataDict[keys[section]]?.count ?? 0 } } WanPai/Root/Course/View/CityChooseSubTypeView.xib
@@ -83,6 +83,7 @@ <connections> <outlet property="cons_viewHeight" destination="eEu-f9-Ced" id="DiD-Kz-VSh"/> <outlet property="label_city" destination="VXl-8W-S4W" id="75K-gD-yyi"/> <outlet property="tableView" destination="TJg-Td-Jbc" id="E6T-Z5-jHa"/> </connections> <point key="canvasLocation" x="72" y="21"/> </view> WanPai/Root/Home/VC/HomeVC.swift
@@ -139,7 +139,7 @@ @IBAction func chooseStoresAction(_ sender: TapBtn) { StoresChooseView.show { [weak self] storeId in self?.viewModel.storeId.accept(storeId.int!) self?.viewModel.storeId.accept(storeId) self?.viewModel.beginRefresh() } } WanPai/Root/Other/TCell/StudentInfo_2_TCell.swift
@@ -12,7 +12,25 @@ @IBOutlet weak var img_radio: UIImageView! @IBOutlet weak var btn_delete: UIButton! @IBOutlet weak var btn_edit: UIButton! @IBOutlet weak var label_name: UILabel! @IBOutlet weak var label_idCard: UILabel! @IBOutlet weak var label_age: UILabel! @IBOutlet weak var label_phone: UILabel! var indexPath:IndexPath? var delClouse:((IndexPath)->Void)? // var editClouse:((IndexPath)->Void)? var activityDetailPartModel:ActivityDetailPartModel!{ didSet{ label_name.text = activityDetailPartModel.name label_idCard.text = activityDetailPartModel.idcard label_age.text = "\(activityDetailPartModel.age)岁" label_phone.text = activityDetailPartModel.phone } } var isChoose:Bool!{ didSet{ @@ -28,8 +46,13 @@ } @IBAction func editAction(_ sender: UIButton) { StudentUpdateInfoView.show() StudentUpdateInfoView.show(activityDetailPartModel) } @IBAction func delAction(_ sender: UIButton) { if let index = indexPath{ delClouse?(index) } } } WanPai/Root/Other/TCell/StudentInfo_2_TCell.xib
@@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="retina6_12" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -69,6 +69,9 @@ <rect key="frame" x="320" y="12" width="16" height="22"/> <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> <state key="normal" image="btn_delete"/> <connections> <action selector="delAction:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="azx-Ts-rCx"/> </connections> </button> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系电话:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yyi-BO-9d9"> <rect key="frame" x="114" y="44" width="71.666666666666686" height="20"/> @@ -149,6 +152,10 @@ <outlet property="btn_delete" destination="uRT-PP-Jry" id="oVl-2n-p1K"/> <outlet property="btn_edit" destination="FQi-mi-aCF" id="Utm-lZ-OLO"/> <outlet property="img_radio" destination="lvC-v3-2oB" id="8h7-kF-JB2"/> <outlet property="label_age" destination="U15-qH-Kc3" id="1Dv-0w-hQ8"/> <outlet property="label_idCard" destination="YtF-LX-bzG" id="tut-IZ-HEr"/> <outlet property="label_name" destination="iDi-s9-qiA" id="XNd-oN-2fI"/> <outlet property="label_phone" destination="eQZ-Ha-dGW" id="OjX-8Q-n5g"/> </connections> <point key="canvasLocation" x="79.389312977099237" y="41.549295774647888"/> </tableViewCell> WanPai/Root/Other/View/StoresChooseView.swift
@@ -26,7 +26,7 @@ private var storesModel = [CityProfileModel]() private var clouse:((String)->Void)! private var clouse:((Int)->Void)! private let disposeBag = DisposeBag() override func awakeFromNib() { @@ -36,7 +36,7 @@ layoutIfNeeded() } static func show(_ clouse:@escaping (String)->Void){ static func show(_ clouse:@escaping (Int)->Void){ let storesView = StoresChooseView.jq_loadNibView() storesView.clouse = clouse storesView.frame = screnDelegate?.window?.frame ?? .zero @@ -132,7 +132,7 @@ } close() clouse?(storeModel!.code) clouse?(storeModel!.id) } } WanPai/Root/Other/View/StudentChooseView.swift
@@ -10,11 +10,19 @@ import QMUIKit import RxSwift import RxCocoa import HandyJSON class StudentViewModel:RefreshModel<CourseDetailStudentModel>{ override func api() -> (Observable<BaseResponse<[CourseDetailStudentModel]>>)? { return Services.queryStudentList() } } class ActivityViewModel:RefreshModel<ActivityDetailPartModel>{ override func api() -> (Observable<BaseResponse<[ActivityDetailPartModel]>>)? { return Services.queryParticipantList() } } class StudentChooseView: UIView,JQNibView{ @@ -24,12 +32,20 @@ @IBOutlet weak var cons_bottom: NSLayoutConstraint! @IBOutlet weak var btn_add: QMUIButton! private var clickClouse:(([CourseDetailStudentModel])->Void)! private var clickClouse:(([Any])->Void)! private var needAddClouse:(()->Void)! private var itemType:ItemType! private var selectStudents = [CourseDetailStudentModel]() private var viewModel = StudentViewModel() private var selectStudents = [Any]() private lazy var stuViewModel:StudentViewModel = { return StudentViewModel() }() private lazy var actViewModel:ActivityViewModel = { return ActivityViewModel() }() override func awakeFromNib() { super.awakeFromNib() btn_add.imagePosition = .right @@ -40,13 +56,9 @@ tableView.separatorStyle = .none alpha = 0 layoutIfNeeded() viewModel.configure(tableView,needMore: false) viewModel.beginRefresh() } static func show(itemType:ItemType,defaultStu:[CourseDetailStudentModel]? = nil,clickClouse:@escaping ([CourseDetailStudentModel])->Void,needAddClouse:@escaping ()->Void){ static func show(itemType:ItemType,defaultStu:[Any]? = nil,clickClouse:@escaping ([Any])->Void,needAddClouse:@escaping ()->Void){ let studentChooseView = StudentChooseView.jq_loadNibView() if defaultStu != nil{ studentChooseView.selectStudents = defaultStu! @@ -62,9 +74,16 @@ studentChooseView.clickClouse = clickClouse studentChooseView.needAddClouse = needAddClouse screnDelegate?.window?.addSubview(studentChooseView) studentChooseView.cons_bottom.constant = 0 if itemType == .course{ studentChooseView.stuViewModel.configure(studentChooseView.tableView,needMore: false) studentChooseView.stuViewModel.beginRefresh() }else{ studentChooseView.actViewModel.configure(studentChooseView.tableView,needMore: false) studentChooseView.actViewModel.beginRefresh() } UIView.animate(withDuration: 0.4) { studentChooseView.alpha = 1 studentChooseView.layoutIfNeeded() @@ -108,14 +127,26 @@ extension StudentChooseView:UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let item = viewModel.dataSource.value[indexPath.row] if self.selectStudents.contains(where: {$0.id == item.id}){ if self.selectStudents.count == 1{ alert(msg: "至少选择一位学员");return } self.selectStudents.remove(at: indexPath.row) if itemType == .course{ let item = stuViewModel.dataSource.value[indexPath.row] if self.selectStudents.contains(where: {($0 as! CourseDetailStudentModel).id == item.id}){ if self.selectStudents.count == 1{ alert(msg: "至少选择一位学员");return } self.selectStudents.remove(at: indexPath.row) }else{ self.selectStudents.append(item) } }else{ self.selectStudents.append(item) let item = actViewModel.dataSource.value[indexPath.row] if self.selectStudents.contains(where: {($0 as! ActivityDetailPartModel).id == item.id}){ if self.selectStudents.count == 1{ alert(msg: "至少选择一位参赛学员");return } self.selectStudents.remove(at: indexPath.row) }else{ self.selectStudents.append(item) } } tableView.reloadData() } @@ -123,15 +154,19 @@ extension StudentChooseView:UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return viewModel.dataSource.value.count if itemType == .course{ return stuViewModel.dataSource.value.count }else{ return actViewModel.dataSource.value.count } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if itemType == .course{ let item = viewModel.dataSource.value[indexPath.row] let item = stuViewModel.dataSource.value[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfoTCell") as! StudentInfoTCell if selectStudents.contains(where: {$0.id == item.id}){ if self.selectStudents.contains(where: {($0 as! CourseDetailStudentModel).id == item.id}){ cell.btn_handle.setImage(UIImage(named: "btn_choose_s"), for: .normal) }else{ cell.btn_handle.setImage(nil, for: .normal) @@ -139,7 +174,16 @@ cell.studentModel = item return cell }else if itemType == .activity{ let item = actViewModel.dataSource.value[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "_StudentInfo_2_TCell") as! StudentInfo_2_TCell cell.btn_delete.isHidden = true cell.btn_edit.isHidden = true cell.activityDetailPartModel = item if self.selectStudents.contains(where: {($0 as! ActivityDetailPartModel).id == item.id}){ cell.img_radio.image = UIImage(named: "btn_choose_s") }else{ cell.img_radio.image = UIImage(named: "") } return cell }