效果圖

三級(jí)聯(lián)動(dòng)效果圖.png
Demo地址
https://github.com/VodkaMY/MYLinkagePickView
Demo 封裝代碼
//
// SdLinkagePickViewCtr.swift
// MYCandy
//
// Created by MaoYan on 2017/9/15.
// Copyright ? 2017年 MYCandy.com. All rights reserved.
//
import UIKit
class SdLinkagePickViewCtr: UIView, UIPickerViewDelegate ,UIPickerViewDataSource {
//選擇器
fileprivate var pickerView:UIPickerView!
//所以地址數(shù)據(jù)集合
fileprivate var addressArray = [[String: AnyObject]]()
//選擇的省索引
fileprivate var provinceIndex = 0
//選擇的市索引
fileprivate var cityIndex = 0
//選擇的縣索引
fileprivate var areaIndex = 0
// 列數(shù)
fileprivate var rowCount:NSInteger?
/// 初始化三集連扳控制器
///
/// - Parameters:
/// - frame: 控制器大小
/// - addressArray: 城市列表數(shù)據(jù)源
/// - rowCount: 列數(shù)
init(frame: CGRect, addressArr:NSArray, rowC:NSInteger) {
super.init(frame: frame)
addressArray = addressArr as! Array
rowCount = rowC
//創(chuàng)建選擇器
pickerView=UIPickerView()
pickerView.frame = frame
//將dataSource設(shè)置成自己
pickerView.dataSource=self
//將delegate設(shè)置成自己
pickerView.delegate=self
self.addSubview(pickerView)
//建立一個(gè)按鈕,觸摸按鈕時(shí)獲得選擇框被選擇的索引
let button = UIButton(frame:CGRect(x:0, y:0, width:100, height:30))
button.backgroundColor = UIColor.blue
button.setTitle("獲取信息",for:.normal)
button.addTarget(self, action:#selector(getPickerViewValue),
for: .touchUpInside)
addSubview(button)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//設(shè)置選擇框的列數(shù)為3列,繼承于UIPickerViewDataSource協(xié)議
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return rowCount ?? 0
}
//設(shè)置選擇框的行數(shù),繼承于UIPickerViewDataSource協(xié)議
func pickerView(_ pickerView: UIPickerView,
numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return self.addressArray.count
} else if component == 1 {
let province = self.addressArray[provinceIndex]
return province["cities"]!.count
} else {
let province = self.addressArray[provinceIndex]
if let city = province["cities"]![cityIndex] as? [String: AnyObject] {
return city["areas"]!.count
} else {
return 0
}
}
}
//設(shè)置選擇框各選項(xiàng)的內(nèi)容,繼承于UIPickerViewDelegate協(xié)議
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int,
forComponent component: Int) -> String? {
if component == 0 {
return self.addressArray[row]["state"] as? String
}else if component == 1 {
let province = self.addressArray[provinceIndex]
let city = province["cities"]![row] as! [String: AnyObject]
return city["city"] as? String
}else {
let province = self.addressArray[provinceIndex]
let city = province["cities"]![cityIndex] as! [String: AnyObject]
return city["areas"]![row] as? String
}
}
//選中項(xiàng)改變事件(將在滑動(dòng)停止后觸發(fā))
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,
inComponent component: Int) {
//根據(jù)列、行索引判斷需要改變數(shù)據(jù)的區(qū)域
switch (component) {
case 0:
provinceIndex = row;
cityIndex = 0;
areaIndex = 0;
pickerView.reloadComponent(1);
pickerView.reloadComponent(2);
pickerView.selectRow(0, inComponent: 1, animated: false);
pickerView.selectRow(0, inComponent: 2, animated: false);
case 1:
cityIndex = row;
areaIndex = 0;
pickerView.reloadComponent(2);
pickerView.selectRow(0, inComponent: 2, animated: false);
case 2:
areaIndex = row;
default:
break;
}
}
//觸摸按鈕時(shí),獲得被選中的索引
@objc public func getPickerViewValue(){
//獲取選中的省
let p = self.addressArray[provinceIndex]
let province = p["state"]!
//獲取選中的市
let c = p["cities"]![cityIndex] as! [String: AnyObject]
let city = c["city"] as! String
//獲取選中的縣(地區(qū))
var area = ""
if (c["areas"] as! [String]).count > 0 {
area = (c["areas"] as! [String])[areaIndex]
}
//拼接輸出消息
let message = "索引:\(provinceIndex)-\(cityIndex)-\(areaIndex)\n"
+ "值:\(province) - \(city) - \(area)"
//消息顯示
let alertController = UIAlertController(title: "您選擇了",
message: message, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "確定", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.parentViewCtr()?.present(alertController, animated: true, completion: nil)
}
func parentViewCtr() -> UIViewController? {
let n = next
while n != nil {
let controller = next?.next
if (controller is UIViewController) {
return controller as? UIViewController
}
}
return nil
}
}
使用步驟
import UIKit
class ViewController:UIViewController{
//所以地址數(shù)據(jù)集合
fileprivate var addressArr = [[String: AnyObject]]()
override func viewDidLoad() {
super.viewDidLoad()
//初始化數(shù)據(jù)
let path = Bundle.main.path(forResource: "address", ofType:"plist")
self.addressArr = NSArray(contentsOfFile: path!) as! Array
let pickV = SdLinkagePickViewCtr(frame: CGRect(x: 0, y: 50, width: self.view.frame.width, height: 300), addressArr: self.addressArr as NSArray, rowC: 3)
self.view.addSubview(pickV)
}
}