Skip to content

Instantly share code, notes, and snippets.

@muhlenXi
Created December 2, 2018 08:53
Show Gist options
  • Save muhlenXi/6d32966d5fc5602478b3ab4eea784846 to your computer and use it in GitHub Desktop.
Save muhlenXi/6d32966d5fc5602478b3ab4eea784846 to your computer and use it in GitHub Desktop.
一个简单收货地址选择器的demo
//
// 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