SwiftUI 中实现省市区选择器


效果如下

import SwiftUI

struct ContentView: View {
    @State private var addressItems: [Province] = []
    @State private var areas: [String] = []
    @State private var selectProvinceIndex = 0
    @State private var selectCityIndex = 0
    @State private var selectArea = ""
    private func loadAddress(){
        guard let addressFileUrl = Bundle.main.url(forResource: "Address", withExtension: "plist"), let data = try? Data(contentsOf: addressFileUrl) else{
            return
        }
        let result = try! PropertyListDecoder().decode([Province].self, from: data)

        self.addressItems = result
    }
    
    private func changeSelectAreas(selectCityIndex: Int){
        let selectedCity = self.addressItems[safe: selectProvinceIndex]?.cities[safe: selectCityIndex]
        if let areas = selectedCity?.areas{
            self.areas = areas
            self.selectArea = areas[safe: 0] ?? ""
        }
    }
    
    var body: some View {
        VStack{
            Text("province: \(addressItems[safe: selectProvinceIndex]?.ProvinceName ?? "未选择")"+",city: \(addressItems[safe: selectProvinceIndex]?.cities[safe: selectCityIndex]?.cityName ?? "未选择")"+",area:\(addressItems[safe: selectProvinceIndex]?.cities[safe: selectCityIndex]?.areas[safe: 0] ?? "未选择")")
            GeometryReader { geometry in
                HStack(spacing: 0){
                    Picker("", selection: $selectProvinceIndex) {
                        ForEach(0.. Element?{
        return indices.contains(index) ? self[index] : nil
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Address.plist代码如下
首先创建一个Property.list文件,命名为Address

在Address.plist文件上右击open as ->Source Code

加入如下代码

<?xml version="1.0" encoding="UTF-8"?>



	
		province
		河北省
		cities
		
			
				areas
				
					长安区
					桥东区
					桥西区
					新华区
					井陉矿区
					裕华区
					井陉县
					正定县
					栾城县
					行唐县
					灵寿县
					高邑县
					深泽县
					赞皇县
					无极县
					平山县
					元氏县
					赵县
					辛集市
					藁城市
					晋州市
					新乐市
					鹿泉市
                    area
                    石家庄市
				
				city
				长安区
			
			
				areas
				
					路南区
					路北区
					古冶区
					开平区
					丰南区
					丰润区
					滦县
					滦南县
					乐亭县
					迁西县
					玉田县
					唐海县
					遵化市
					迁安市
				
				city
				唐山市
			
			
				areas
				
					海港区
					山海关区
					北戴河区
					青龙满族自治县
					昌黎县
					抚宁县
					卢龙县
				
				city
				秦皇岛市
			
			
				areas
				
					邯山区
					丛台区
					复兴区
					峰峰矿区
					邯郸县
					临漳县
					成安县
					大名县
					涉县
					磁县
					肥乡县
					永年县
					邱县
					鸡泽县
					广平县
					馆陶县
					魏县
					曲周县
					武安市
				
				city
				邯郸市
			
			
				areas
				
					桥东区
					桥西区
					邢台县
					临城县
					内丘县
					柏乡县
					隆尧县
					任县
					南和县
					宁晋县
					巨鹿县
					新河县
					广宗县
					平乡县
					威县
					清河县
					临西县
					南宫市
					沙河市
				
				city
				邢台市
			
			
				city
				保定市
				areas
				
					新市区
					北市区
					南市区
					满城县
					清苑县
					涞水县
					阜平县
					徐水县
					定兴县
					唐县
					高阳县
					容城县
					涞源县
					望都县
					安新县
					易县
					曲阳县
					蠡县
					顺平县
					博野县
					雄县
					涿州市
					定州市
					安国市
					高碑店市
				
			
			
				city
				张家口市
				areas
				
                                        桥东区
                                        桥西区
                                        宣化区
                                        下花园区
                                        宣化县
                                        张北县
                                        康保县
                                        沽源县
                                        尚义县
                                        蔚县
                                        阳原县
                                        怀安县
                                        万全县
                                        怀来县
                                        涿鹿县
                                        赤城县
                                        崇礼县
				
			
			
				city
				秦皇岛市
				areas
				
                                        海港区
                                        山海关区
                                        北戴河区
                                        青龙满族自治县
                                        昌黎县
                                        抚宁县
                                        卢龙县
				
			
			
				city
				承德市
				areas
				
					双桥区
					双滦区
					鹰手营子矿区
					承德县
					兴隆县
					平泉县
					滦平县
					隆化县
					丰宁满族自治县
					宽城满族自治县
					围场满族蒙古族自治县
				
			
			
				city
				沧州市
				areas
				
					新华区
					运河区
					沧县
					青县
					东光县
					海兴县
					盐山县
					肃宁县
					南皮县
					吴桥县
					献县
					孟村回族自治县
					泊头市
					任丘市
					黄骅市
					河间市
				
			
			
				city
				廊坊市
				areas
				
					安次区
					广阳区
					固安县
					永清县
					香河县
					大城县
					文安县
					大厂回族自治县
					霸州市
					三河市
				
			
			
				city
				衡水市
				areas
				
					桃城区
					枣强县
					武邑县
					武强县
					饶阳县
					安平县
					故城县
					景县
					阜城县
					冀州市
					深州市