Created
December 2, 2018 08:53
-
-
Save muhlenXi/6d32966d5fc5602478b3ab4eea784846 to your computer and use it in GitHub Desktop.
一个简单收货地址选择器的demo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// AreaSelectPicker.swift | |
// SF | |
// | |
// Created by muhlenXi on 2018/11/28. | |
// Copyright © 2018 muhlenXi. All rights reserved. | |
// | |
import UIKit | |
// MARK: 地址模型 | |
class AreaModel { | |
var name: String? | |
var childs: [AreaModel]? | |
init(name: String?, childs: [AreaModel]?) { | |
self.name = name | |
self.childs = childs | |
} | |
} | |
// MARK: - ExploreUIPickViewController | |
class ExploreUIPickViewController: UIViewController { | |
/// 地址选择器数据源 | |
var areas = [AreaModel]() | |
/// 地址选择器 临时数据 记录 | |
private var provinceIndex: Int = 0 | |
private var cityIndex: Int = 0 | |
private var districtIndex: Int = 0 | |
private lazy var toolBar: UIToolbar = { | |
let toolbar = UIToolbar() | |
toolbar.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 44) | |
toolbar.backgroundColor = UIColor.white | |
let cancel = UIBarButtonItem(title: "取消", style: .done, target: self, action: #selector(self.onClickCancelItem(_:))) | |
let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil) | |
let done = UIBarButtonItem(title: "确定", style: .done, target: self, action: #selector(self.onClickDoneItem(_:))) | |
toolbar.items = [cancel, space, done] | |
return toolbar | |
}() | |
private lazy var zoneInputView: UITextField = { | |
let textField = UITextField() | |
textField.font = UIFont.systemFont(ofSize: 16) | |
textField.textColor = UIColor(red: 48/255.0, green: 48/255.0, blue: 48/255.0, alpha: 1) | |
textField.placeholder = "点击选择省市区" | |
textField.inputView = areasPickerView | |
textField.inputAccessoryView = toolBar | |
textField.borderStyle = .roundedRect | |
return textField | |
}() | |
private lazy var areasPickerView: UIPickerView = { | |
let pickerView = UIPickerView() | |
pickerView.backgroundColor = UIColor.white | |
pickerView.dataSource = self | |
pickerView.delegate = self | |
return pickerView | |
}() | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
self.createData() | |
self.setupSubviews() | |
} | |
// MARK: Private method | |
func setupSubviews() { | |
self.view.backgroundColor = UIColor.white | |
zoneInputView.frame = CGRect(x: 15, y: 150, width: UIScreen.main.bounds.size.width-CGFloat(30), height: 50) | |
self.view.addSubview(zoneInputView) | |
} | |
} | |
// MARK: OnClick events | |
extension ExploreUIPickViewController { | |
@objc func onClickDoneItem(_ sender: UIBarButtonItem) { | |
zoneInputView.resignFirstResponder() | |
let province = areas[provinceIndex].name ?? "" | |
let city = areas[provinceIndex].childs?[cityIndex].name ?? "" | |
let district = areas[provinceIndex].childs?[cityIndex].childs?[districtIndex].name ?? "" | |
zoneInputView.text = "\(province)-\(city)-\(district)" | |
} | |
@objc func onClickCancelItem(_ sender: UIBarButtonItem) { | |
zoneInputView.resignFirstResponder() | |
} | |
} | |
// MARK: UIPickerViewDelegate, UIPickerViewDataSource | |
extension ExploreUIPickViewController: UIPickerViewDelegate, UIPickerViewDataSource { | |
func numberOfComponents(in pickerView: UIPickerView) -> Int { | |
return 3 | |
} | |
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { | |
switch component { | |
case 0: | |
return areas.count | |
case 1: | |
return areas[provinceIndex].childs?.count ?? 0 | |
case 2: | |
return areas[provinceIndex].childs?[cityIndex].childs?.count ?? 0 | |
default: | |
break | |
} | |
return 0 | |
} | |
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { | |
switch component { | |
case 0: | |
return areas[row].name | |
case 1: | |
return areas[provinceIndex].childs?[row].name | |
case 2: | |
return areas[provinceIndex].childs?[cityIndex].childs?[row].name | |
default: | |
break | |
} | |
return nil | |
} | |
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { | |
print("row: \(row), component: \(component)") | |
switch component { | |
case 0: | |
self.provinceIndex = row | |
self.cityIndex = 0 | |
self.districtIndex = 0 | |
pickerView.reloadAllComponents() | |
pickerView.selectRow(self.cityIndex, inComponent: 1, animated: true) | |
pickerView.selectRow(self.districtIndex, inComponent: 2, animated: true) | |
case 1: | |
self.cityIndex = row | |
self.districtIndex = 0 | |
pickerView.reloadComponent(2) | |
pickerView.selectRow(self.districtIndex, inComponent: 2, animated: true) | |
case 2: | |
self.districtIndex = row | |
default: | |
break | |
} | |
} | |
} | |
// MARK: 生成示例数据 | |
extension ExploreUIPickViewController { | |
func createData() { | |
let shijiazhuang = AreaModel(name: "石家庄", childs: [AreaModel(name: "长安区", childs: nil), | |
AreaModel(name: "桥东区", childs: nil), | |
AreaModel(name: "桥西区", childs: nil), | |
AreaModel(name: "新华区", childs: nil), | |
AreaModel(name: "裕华区", childs: nil)]) | |
let langfang = AreaModel(name: "廊坊", childs: [AreaModel(name: "安次区", childs: nil), | |
AreaModel(name: "广阳区", childs: nil), | |
AreaModel(name: "固安县", childs: nil), | |
AreaModel(name: "永清县", childs: nil), | |
AreaModel(name: "香河县", childs: nil)]) | |
let hebei = AreaModel(name: "河北", childs: [shijiazhuang, langfang]) | |
let taiyuan = AreaModel(name: "太原", childs: [AreaModel(name: "小店区", childs: nil), | |
AreaModel(name: "迎泽区", childs: nil), | |
AreaModel(name: "杏花岭区", childs: nil), | |
AreaModel(name: "尖草坪区", childs: nil), | |
AreaModel(name: "万柏林区", childs: nil)]) | |
let linfen = AreaModel(name: "临汾", childs: [AreaModel(name: "尧都区", childs: nil), | |
AreaModel(name: "曲沃县", childs: nil), | |
AreaModel(name: "翼城县", childs: nil), | |
AreaModel(name: "洪洞县", childs: nil), | |
AreaModel(name: "古县", childs: nil)]) | |
let shanxi = AreaModel(name: "山西", childs: [taiyuan, linfen]) | |
let baotou = AreaModel(name: "包头", childs: [AreaModel(name: "东河区", childs: nil), | |
AreaModel(name: "昆都仑区", childs: nil), | |
AreaModel(name: "青山区", childs: nil), | |
AreaModel(name: "石拐区", childs: nil), | |
AreaModel(name: "九原区", childs: nil)]) | |
let huhehaote = AreaModel(name: "呼和浩特", childs: [AreaModel(name: "新城区", childs: nil), | |
AreaModel(name: "回民区", childs: nil), | |
AreaModel(name: "玉泉区", childs: nil), | |
AreaModel(name: "赛罕区", childs: nil), | |
AreaModel(name: "土默特左旗", childs: nil)]) | |
let neimenggu = AreaModel(name: "内蒙古", childs: [huhehaote, baotou]) | |
self.areas.append(hebei) | |
self.areas.append(shanxi) | |
self.areas.append(neimenggu) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment