本文共 7586 字,大约阅读时间需要 25 分钟。
省市区乡镇联动:
1.*********省市区三级联动*********
/** UIPickView、省市区 需要注意的问题:同时滑动两列崩溃,解决办法:判断后执行 使用: let provincepick = LYBUIPickView.init(frame: CGRect(x: 10, y: 0, width: WIDTH, height: 300)) provincepick.provinceCityAreaBlock={ (province,city,area)in print("\(province)---\(city)---\(area)") } view.addSubview(provincepick) */import UIKitclass LYBUIPickView: UIView,UIPickerViewDelegate,UIPickerViewDataSource { var pickerView:UIPickerView! var modelArr:[LYBprovinceModel]?//所有数据的模型数组 var provincemodel:LYBprovinceModel?//省模型 var citymodel:LYBCityModel?//市模型 var provinceStr:String?=""//省 var cityStr:String?=""//市 var area:String?=""//区 //定义一个闭包把省市区数据传出去 var provinceCityAreaBlock:(_ province:String,_ city:String,_ area:String)->()={(province:String,city:String,area:String)->()in} override init(frame: CGRect) { super.init(frame:frame) createDatePickview(frame: frame) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } //确认或取消按钮 @objc func sureOrcanceBtnClick(sender:UIButton){ switch sender.tag { case 20://取消 self.removeFromSuperview() break case 21: self.provinceCityAreaBlock(provinceStr!,cityStr!,area!) self.removeFromSuperview() break default: break } } //解析省市区数据 func parseDate(){ let path=Bundle.main.path(forResource: "shengshiquxianarea.plist", ofType: nil) let proviceDataArr:NSArray = NSArray(contentsOfFile:path!)! modelArr=([LYBprovinceModel].deserialize(from: proviceDataArr) as! [LYBprovinceModel])// print("\(modelArr?.first?.cities?.first?.areas)") } //设置默认的省市区字符串 func setDefaultProvinceCityArea(){ provincemodel=modelArr![0]//默认选中第一个省的模型 provinceStr=provincemodel?.state//省名称 if((provincemodel?.cities?.count)!>0){ cityStr=provincemodel?.cities?.first?.city//城市,默认先选第一个 if((provincemodel?.cities?.first?.areas?.count)!>0){ area = provincemodel?.cities?.first?.areas?.first//区,默认先选第一个 } } } func createDatePickview(frame: CGRect){ parseDate() setDefaultProvinceCityArea()//设置默认的省市区 //取消和确定按钮 let buttonView=UIView.init(frame: CGRect.init(x: 0, y: 0, width: WIDTH, height: 50)) addSubview(buttonView) let cancelBtn=UIButton.init(frame: CGRect.init(x: 20, y: 0, width: 100, height: 50)) cancelBtn.setTitle("取消", for: UIControl.State.normal) cancelBtn.tag=20 cancelBtn.addTarget(self, action: #selector(sureOrcanceBtnClick), for: UIControl.Event.touchUpInside) buttonView.addSubview(cancelBtn) let sureBtn=UIButton.init(frame: CGRect.init(x: WIDTH-150, y: 0, width: 100, height: 50)) sureBtn.setTitle("确定", for: UIControl.State.normal) sureBtn.tag=21 sureBtn.addTarget(self, action: #selector(sureOrcanceBtnClick), for: UIControl.Event.touchUpInside) buttonView.addSubview(sureBtn) //初始化UIPickerView pickerView = UIPickerView.init(frame: CGRect(x:0, y:50, width:WIDTH, height:frame.size.height-50)) pickerView.dataSource = self pickerView.delegate = self //设置选择框的默认值 pickerView.selectRow(0,inComponent:0,animated:true) addSubview(pickerView) } //设置选择框的列数为3列,继承于UIPickerViewDataSource协议 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 3 } //设置选择框的行数,继承于UIPickerViewDataSource协议 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if component==0 { return (modelArr?.count)! }else if(component==1){ let provincenum=pickerView.selectedRow(inComponent: 0)//第一列选中的行号 provincemodel=modelArr![provincenum]//选中的省的模型 return (provincemodel!.cities?.count)! }else if(component==2){ let citynum=pickerView.selectedRow(inComponent: 1)//第2列选中的行号 if((provincemodel?.cities?.count)!>citynum){ citymodel=provincemodel?.cities![citynum]//选中的城市模型 } return (citymodel?.areas?.count)! } return 0 } //设置选择框各显示的内容,继承于UIPickerViewDelegate协议 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if(component==0){ provincemodel=modelArr![row] return provincemodel?.state }else if(component==1){ if((provincemodel?.cities?.count)!>row){ citymodel=provincemodel?.cities![row]//选中的城市模型 } return citymodel!.city }else if(component==2){ if(citymodel!.areas!.count>row){ return citymodel!.areas![row]; } } return "" } // //自定义返回每一行返回的内容,如果设置了这个自定义的,上面的titlefor view就被覆盖了 // func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { // // return UIView.init() // } //选中某一行 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if component==0 { let provinceIndex=pickerView.selectedRow(inComponent: 0)//第一列选中的行号 provincemodel=modelArr![provinceIndex]//选中的省的模型 provinceStr=provincemodel?.state//省 if((provincemodel?.cities?.count)!>0){ pickerView.reloadComponent(1) pickerView.selectRow(0, inComponent: 1, animated: true) cityStr=provincemodel?.cities?.first?.city//城市,默认先选第一个 area=""//如果是澳门国外等没有第三列,在这里置为空,要不然就会显示最有一个数据 if((provincemodel?.cities?.first?.areas?.count)!>0){ area = provincemodel?.cities?.first?.areas?.first//区,默认先选第一个 } pickerView.reloadComponent(2) } }else if(component==1){ let citynum=pickerView.selectedRow(inComponent: 1)//第1列选中的行号 citymodel=provincemodel?.cities![citynum]//选中的城市模型 cityStr=citymodel?.city//选中的城市 pickerView.reloadComponent(2) area=""//如果是澳门国外等没有第三列,在这里置为空,要不然就会显示最有一个数据 if((citymodel?.areas?.count)!>0){ area=citymodel?.areas?.first pickerView.selectRow(0, inComponent: 2, animated: true) } }else if(component==2){ let areaIndx=pickerView.selectedRow(inComponent: 2)//第2列选中的行号 let citynum=pickerView.selectedRow(inComponent: 1)//第1列选中的行号 citymodel=provincemodel?.cities![citynum]//选中的城市模型 if((citymodel?.areas?.count)!>0){ area=citymodel?.areas![areaIndx] } } self.provinceCityAreaBlock(provinceStr!,cityStr!,area!)// print("\(provinceStr)---\(cityStr)---\(area)") } }********下面是模型*****/** 省的模型 */import UIKitclass LYBprovinceModel:HandyJSON { var state:String?//省 var cities:[LYBCityModel]?//城市 //必须加上下面的方法 required init(){}}*********/** 城市 */import UIKitclass LYBCityModel:HandyJSON { var city:String?// 城市 var areas:[String]?//区、县级市 //必须加上下面的方法 required init(){}}******/** 区、县模型,这个个暂时用不到 */import UIKitclass LYBAreaModel:HandyJSON{ var area:String?//区、县级市 //必须加上下面的方法 required init(){}}
转载地址:http://fmmgi.baihongyu.com/