初學(xué)swift語言沒幾天闸氮,就試著自己寫了一個城市選擇器折晦,純swift代碼。
ViewController.swift文件中漆改,個人編程習(xí)慣是把視圖生命周期心铃,視圖設(shè)置,相關(guān)代理方法實現(xiàn)籽懦,事件響應(yīng)于个,網(wǎng)絡(luò)請求等方法標(biāo)記后放在響應(yīng)代碼區(qū),正好可以利用swift語言的extension特性將代碼功能分類暮顺,這樣代碼不僅易讀厅篓,還有利于調(diào)試:
import UIKit
//MARK: View life cycle
class ViewController: UIViewController {
? ? /** 懶加載的城市數(shù)據(jù)源數(shù)組 */
? ? fileprivate lazy var cCityDataArray:[StateModel] = {
? ? //Plist文件路徑
? ? let path = Bundle.main.path(forResource: "area", ofType: "plist")
? ? var areas: NSArray? = nil
? ? //讀取Plist文件數(shù)組
? ? if let arrayPath = path {
? ? ? ? areas = NSArray (contentsOfFile: arrayPath)
? ? }
? ? //數(shù)組轉(zhuǎn)換為模型數(shù)組
? ? var cityData = Array()
? ? if let areasArr = areas {
? ? ? ? for area in areasArr {
? ? ? ? ? ? let areaDic = area as! NSDictionary
? ? ? ? ? ? let stateModel = StateModel.init(dictionary: areaDic)
? ? ? ? ? ? cityData.append(stateModel)
? ? ? ? }
? ? }
? ? return cityData
? ? }()
? ? /** 省級數(shù)據(jù)源數(shù)組 */
? ? fileprivate var cStatesArr: [StateModel]? = nil
? ? /** 市級數(shù)據(jù)源數(shù)組 */
? ? fileprivate var cCitiesArr: [CityModel]? = nil
? ? /** 區(qū)級數(shù)據(jù)源數(shù)組 */
? ? fileprivate var cAreasArr: [String]? = nil
? ? /** 選擇城市的textField */
? ? fileprivate let cCityTextField: UITextField? = UITextField()
? ? /** 選擇城市的pickerView */
? ? fileprivate let cCityPickerView: UIPickerView? = UIPickerView()
? ? /** 選擇城市的toolBar */
? ? fileprivate let cCityToolBar: UIToolbar? = UIToolbar()
? ? /** 選擇城市的背景蒙版 */
? ? fileprivate let cTextFieldCoverButton: UIButton = UIButton (frame: UIScreen.main.bounds)
? ? override func viewDidLoad() {
? ? ? ? super.viewDidLoad()
? ? ? ? self.view.backgroundColor = UIColor(red:0.85, green:0.85, blue:0.85, alpha:1.00)
? ? ? ? self.setupSubviews()
? ? ? ? //設(shè)置數(shù)據(jù)源數(shù)組初始值
? ? ? ? cStatesArr = cCityDataArray
? ? ? ? cCitiesArr = cStatesArr?.first?.cities
? ? ? ? cAreasArr = cCitiesArr?.first?.areas
? ? }
? ? override func didReceiveMemoryWarning() {
? ? ? ? super.didReceiveMemoryWarning()
? ? }
}
//MARK: Setup
extension ViewController {
? ? /** 設(shè)置subviews */
? ? fileprivate func setupSubviews() -> Void {
? ? self.setupTextField()
? ? self.setupCoverButton()
? ? self.setupPickerView()
? ? self.setupToolBar()
? ? }
? ? /** 設(shè)置textField */
? ? private func setupTextField() -> Void {
? ? ? ? if let cityTextField = cCityTextField {
? ? ? ? ? ? cityTextField.frame = CGRect (x: 50, y: 200, width: 200, height: 44)
? ? ? ? ? ? cityTextField.delegate = self
? ? ? ? ? ? cityTextField.backgroundColor = UIColor.white
? ? ? ? ? ? cityTextField.placeholder = "請選擇城市"
? ? ? ? ? ? cityTextField.borderStyle = UITextBorderStyle.roundedRect
? ? ? ? ? ? self.view.addSubview(cityTextField)
? ? ? ? }
? ? }
? ? /** 設(shè)置背景蒙版Button */
? ? private func setupCoverButton() -> Void {
? ? ? ? cTextFieldCoverButton.addTarget(self, action: #selector(clickTextFieldCoverButton(sender:)), for: UIControlEvents.touchUpInside)
? ? ? ? self.view.addSubview(cTextFieldCoverButton)
? ? ? ? cTextFieldCoverButton.isHidden = true
? ? }
? ? /** 設(shè)置pickerView */
? ? private func setupPickerView() -> Void {
? ? ? ? if let cityPickerView = cCityPickerView {
? ? ? ? ? ? cityPickerView.delegate = self
? ? ? ? ? ? cityPickerView.dataSource = self
? ? ? ? ? ? cCityTextField!.inputView = cityPickerView
? ? ? ? }
? ? }
? ? /** 設(shè)置toolBar */
? ? private func setupToolBar() -> Void {
? ? ? ? if let cityToolBar = cCityToolBar {
? ? ? ? ? ? cityToolBar.frame = CGRect (x: 0, y: 0, width: 0, height: 44)
? ? ? ? ? ? cityToolBar.backgroundColor = UIColor.white
? ? ? ? ? ? let cancelItem = UIBarButtonItem.init(title: "取消", style: UIBarButtonItemStyle.done, target: self, action: #selector(clickToolBarCancelItem(sender:)))
? ? ? ? ? ? let spaceItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
? ? ? ? ? ? let doneItem = UIBarButtonItem.init(title: "確定", style: UIBarButtonItemStyle.done, target: self, action: #selector(clickToolBarDoneItem(sender:)))
? ? ? ? ? ? cityToolBar.items = [cancelItem, spaceItem, doneItem]
? ? ? ? ? ? cCityTextField?.inputAccessoryView = cityToolBar
? ? ? ? }
? ? }
}
//MARK: UITextFieldDelegate
extension ViewController: UITextFieldDelegate {
? ? func textFieldDidBeginEditing(_ textField: UITextField) {
? ? ? ? cTextFieldCoverButton.isHidden = false
? ? }
? ?
? ? func textFieldDidEndEditing(_ textField: UITextField) {
? ? ? ? cTextFieldCoverButton.isHidden = true
? ? }
}
//MARK: UIPickerViewDelegate
extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {
?
? ? func numberOfComponents(in pickerView: UIPickerView) -> Int {
? ? ? ? return 3
? ? }
? ? func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
? ? ? ? switch component {
? ? ? ? case 0:
? ? ? ? ? ? return cStatesArr!.count
? ? ? ? case 1:
? ? ? ? ? ? return cCitiesArr!.count
? ? ? ? case 2:
? ? ? ? ? ? return cAreasArr!.count
? ? ? ? default:
? ? ? ? ? ? return 0
? ? ? ? }
? ? }
? ? func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
? ? ? ? switch component {
? ? ? ? case 0:
? ? ? ? ? ? return cStatesArr!.count
? ? ? ? case 1:
? ? ? ? ? ? return cCitiesArr!.count
? ? ? ? case 2:
? ? ? ? ? ? return cAreasArr![row]
? ? ? ? default:
? ? ? ? ? ? return nil
? ? ? ? }
? ? }
? ? func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
? ? ? ? return self.view.frame.width / 3
? ? }
? ? func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
? ? ? ? switch component {
? ? ? ? case 0:
? ? ? ? ? ? //保存市級數(shù)據(jù)源數(shù)組
? ? ? ? ? ? cCitiesArr = cCityDataArray[row].cities
? ? ? ? ? ? //若有區(qū)級數(shù)據(jù),則保存區(qū)級數(shù)據(jù)源數(shù)組
? ? ? ? ? ? if cCitiesArr?.first?.areas != nil {
? ? ? ? ? ? ? ? cAreasArr = cCitiesArr?.first?.areas
? ? ? ? ? ? }
? ? ? ? ? ? //重新加載第1捶码、2組
? ? ? ? ? ? pickerView.reloadComponent(1)
? ? ? ? ? ? pickerView.reloadComponent(2)
? ? ? ? ? ? //默認(rèn)選中第1羽氮、2組的第1行數(shù)據(jù)
? ? ? ? ? ? pickerView.selectRow(0, inComponent: 1, animated: true)
? ? ? ? ? ? pickerView.selectRow(0, inComponent: 2, animated: true)
? ? ? ? case 1:
? ? ? ? ? ? //保存區(qū)級數(shù)據(jù)源數(shù)組
? ? ? ? ? ? if cCitiesArr![row].areas.count != 0 {
? ? ? ? ? ? ? ? cAreasArr = cCitiesArr![row].areas
? ? ? ? ? ? }
? ? ? ? ? ? //重新加載第2組數(shù)據(jù)
? ? ? ? ? ? pickerView.reloadComponent(2)
? ? ? ? ? ? //默認(rèn)選中第2組第1行數(shù)據(jù)
? ? ? ? ? ? pickerView.selectRow(0, inComponent: 2, animated: true)
? ? ? ? default:
? ? ? ? ? ? return
? ? ? ? }
? ? }
}
//MARK: Event response
extension ViewController {
? ? @objc fileprivate func clickTextFieldCoverButton(sender: UIButton) -> Void {
? ? ? ? cCityTextField?.resignFirstResponder()
? ? }
? ? @objc fileprivate func clickToolBarCancelItem(sender: UIBarButtonItem) -> Void {
? ? ? ? cCityTextField?.resignFirstResponder()
? ? }
? ? @objc fileprivate func clickToolBarDoneItem(sender: UIBarButtonItem) -> Void {
? ? ? ? cCityTextField?.resignFirstResponder()
? ? ? ? let selectedState = cCityPickerView?.selectedRow(inComponent: 0)
? ? ? ? let selectedCity = cCityPickerView?.selectedRow(inComponent: 1)
? ? ? ? let selectedArea = cCityPickerView?.selectedRow(inComponent: 2)
? ? ? ? var cityString = (cStatesArr?[selectedState!].state)! + (cCitiesArr?[selectedCity!].city)!
? ? ? ? if cAreasArr?.count != 0 {
? ? ? ? ? ? cityString += (cAreasArr?[selectedArea!])!
? ? ? ? }
? ? ? ? cCityTextField?.text = cityString
? ? }
}
StateModel.swift文件中,用于保存省級數(shù)據(jù):
import UIKit
/** 省級Model */
class StateModel: NSObject {
? ? /** 省下級所有城市 */
? ? let cities: Array
? ? /** 省級名稱 */
? ? let state: String
? ? init(dictionary: NSDictionary) {
? ? ? ? state = dictionary["state"] as! String
? ? ? ? let citiesArr = dictionary["cities"] as! NSArray
? ? ? ? var citiesMutableArr = Array()
? ? ? ? for city in citiesArr {
? ? ? ? ? ? let cityDic = city as! NSDictionary
? ? ? ? ? ? let cityModel = CityModel.init(dictionary: cityDic)
? ? ? ? ? ? citiesMutableArr.append(cityModel)
? ? ? ? }
? ? ? ? cities = citiesMutableArr
? ? }
}
CityModel.swift文件中惫恼,保存市/區(qū)級數(shù)據(jù):
import UIKit
//MARK: 城市Model
class CityModel: NSObject {
? ? /** 城市下級area */
? ? let areas: Array
? ? /** 城市名 */
? ? let city: String
? ? init(dictionary: NSDictionary){
? ? ? ? city = dictionary["city"] as! String
? ? ? ? let areasArr = dictionary["areas"] as! NSArray
? ? ? ? var areasMutableArr = Array()
? ? ? ? for area in areasArr {
? ? ? ? ? ? let areaString = area as! String
? ? ? ? ? ? areasMutableArr.append(areaString)
? ? ? ? }
? ? ? ? areas = areasMutableArr
}
}
博客地址:http://www.cnblogs.com/keqipu/?
qq:915621674
歡迎學(xué)習(xí)與交流