博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios/swift 之省市区三级联动的实现
阅读量:4291 次
发布时间:2019-05-27

本文共 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/

你可能感兴趣的文章
高并发环境下,先操作数据库还是先操作缓存?
查看>>
MySQL Explain详解
查看>>
一直搞不清楚什么是读写分离,主从复制的原理,今天总算搞懂了
查看>>
消息队列 mq 必会面试题
查看>>
线程池的工作原理是啥?能手写一个线程池吗?
查看>>
一口气说出 6种 延时队列的实现方案,大厂offer稳稳的
查看>>
原来redis这么简单,跟着文章操作一遍你就会了
查看>>
Redis两种持久化机制RDB和AOF详解(面试常问,工作常用)
查看>>
事务隔离级别中的可重复读能防幻读吗?
查看>>
老伙计,关于JDK并发包,这些不为人知的秘密你知道多少?
查看>>
图片的左右切换
查看>>
进级的RecyclerView——LRecyclerView
查看>>
Android 利用Gradle实现app的环境分离
查看>>
Android系统篇之----Binder机制和远程服务调用
查看>>
JavaScript DOM 属性
查看>>
Gradle 实现 Android 多渠道定制化打包
查看>>
Android开源项目及库整理总结
查看>>
Android快速开发系列 10个常用工具类
查看>>
深入理解JSON对象
查看>>
类似新浪微博帖子显示话题、@好友、表情解析等
查看>>