ios/swift 之省市区三级联动的实现

2024-05-31 09:32

本文主要是介绍ios/swift 之省市区三级联动的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

省市区乡镇联动:https://github.com/artiely/Administrative-divisions-of-China

1.*********省市区三级联动*********

/**UIPickView、省市区需要注意的问题:同时滑动两列崩溃,解决办法:判断后执行使用:let provincepick =    LYBUIPickView.init(frame: CGRect(x: 10, y: 0, width: WIDTH, height: 300))provincepick.provinceCityAreaBlock={(province,city,area)inprint("\(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()breakcase 21:self.provinceCityAreaBlock(provinceStr!,cityStr!,area!)self.removeFromSuperview()breakdefault: 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=20cancelBtn.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=21sureBtn.addTarget(self, action: #selector(sureOrcanceBtnClick), for: UIControl.Event.touchUpInside)buttonView.addSubview(sureBtn)//初始化UIPickerViewpickerView = UIPickerView.init(frame: CGRect(x:0, y:50, width:WIDTH, height:frame.size.height-50))pickerView.dataSource = selfpickerView.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?.firstpickerView.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(){}
}

 

这篇关于ios/swift 之省市区三级联动的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017686

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、