博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS/swift之UIPickView
阅读量:4290 次
发布时间:2019-05-27

本文共 7143 字,大约阅读时间需要 23 分钟。

1.********************UIPickView****************

/** 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)")    }    }

 

转载地址:http://elmgi.baihongyu.com/

你可能感兴趣的文章
请不要做浮躁的人----(学习编程的忠告)
查看>>
网络_volley_使用方法和代码
查看>>
网络_AsyncHttpClient_使用方法和代码
查看>>
网络_断点续传.断点下载
查看>>
网络_Xutils
查看>>
网络_多线程下载
查看>>
网络_httpClient
查看>>
网络_HttpURLConnection_原始类
查看>>
网络_OKHttp
查看>>
android_事件分发机制_几行代码直接通晓
查看>>
图片_OOM_OutOfMemory
查看>>
技术学习_经验分享
查看>>
android中常见的设计模式有哪些?
查看>>
ViewDragHelper_v4的滑动视图帮助类_解释和代码
查看>>
即时通讯技术- 推送技术协议方案
查看>>
vitamio简介.java
查看>>
ActiveMQ 实现负载均衡+高可用部署方案
查看>>
《搜索和推荐中的深度匹配》——2.5 延伸阅读
查看>>
解读:阿里文娱搜索算法实践与思考
查看>>
基于位置的点击模型
查看>>