swift 城市選擇三級聯動選擇器

//項目

import UIKit

import SnapKit

class ChangeHomeAddressVC: BaseViewController,UIPickerViewDelegate,UIPickerViewDataSource{

var pickerDic:NSDictionary!

var provinceArray:NSArray!

var cityArray:NSArray!

var townArray:NSArray!

var selectedArray:NSArray!

override func viewDidLoad() {

super.viewDidLoad()

self.navigationItem.title = "更改家庭地址"

//右邊導航鍵

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "保存", style: UIBarButtonItemStyle.Plain, target: self, action: #selector(ChangeHomeAddressVC.changeAddressByPicker))

prepareUI()

addPickView()

getPickerData()

}

//屏幕點擊事件

override func touchesBegan(touches: Set, withEvent event: UIEvent?) {

self.view.endEditing(true)

}


//點擊了改變地址的view觸發事件

func changeAddress() {

print("點擊了改變地址的view")

if cityPickView.frame.origin.y < UIScreen.mainScreen().bounds.height - 204{

print("點擊過了")

}else {

likeToolView.hidden = false

cityPickView.hidden = false

UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

self.likeToolView.transform = CGAffineTransformTranslate(self.likeToolView.transform, 0, -204)

self.cityPickView.transform = CGAffineTransformTranslate(self.cityPickView.transform , 0, -204)

}, completion: nil)

}

}

//MARK:? -視圖

func prepareUI() {

self.view.addSubview(topView)

topView.addSubview(labelView)

labelView.addSubview(addressLabel)

labelView.addSubview(cityLabel)

labelView.addSubview(districtLabel)

topView.addSubview(fengGeLine)

topView.addSubview(AddressTextField)

labelView.snp_makeConstraints { (make) in

make.trailing.equalTo(topView.snp_trailing)

make.leading.equalTo(topView.snp_leading)

make.top.equalTo(topView.snp_top)

make.height.equalTo(44)

}

cityLabel.snp_makeConstraints { (make) in

make.centerY.equalTo(addressLabel.snp_centerY)

make.leading.equalTo(addressLabel.snp_trailing).offset(5)

}

districtLabel.snp_makeConstraints { (make) in

make.centerY.equalTo(addressLabel.snp_centerY)

make.leading.equalTo(cityLabel.snp_trailing).offset(5)

}

AddressTextField.snp_makeConstraints { (make) in

make.top.equalTo(fengGeLine.snp_bottom).offset(20)

make.leading.equalTo(fengGeLine.snp_leading)

make.trailing.equalTo(fengGeLine.snp_trailing)

}

fengGeLine.snp_makeConstraints { (make) in

make.top.equalTo(labelView.snp_bottom)

make.leading.equalTo(self.view.snp_leading).offset(10)

make.trailing.equalTo(self.view.snp_trailing).offset(-10)

make.height.equalTo(1)

}

addressLabel.snp_makeConstraints { (make) in

make.top.equalTo(labelView.snp_top).offset(15)

make.leading.equalTo(labelView.snp_leading).offset(10)

}

topView.snp_makeConstraints { (make) in

make.top.equalTo(self.view.snp_top).offset(10)

make.leading.equalTo(self.view.snp_leading)

make.trailing.equalTo(self.view.snp_trailing)

make.height.equalTo(99)

}

}

lazy var topView : UIView = {

let view = UIView()

view.backgroundColor = UIColor.whiteColor()

return view

}()

lazy var labelView : UIView? = {

let view = UIView()

view.backgroundColor = UIColor.whiteColor()

let addressLabelGesture = UITapGestureRecognizer.init(target: self, action: #selector(ChangeHomeAddressVC.changeAddress))

view.addGestureRecognizer(addressLabelGesture)

return view

}()

//省

lazy var addressLabel : UILabel = {

let label = UILabel()

label.text = "省市區"

label.font = UIFont.systemFontOfSize(14)

label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

return label

}()

//市

lazy var cityLabel : UILabel = {

let label =? UILabel()

label.text = " "

label.font = UIFont.systemFontOfSize(14)

label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

return label

}()

//區

lazy var districtLabel : UILabel = {

let label =? UILabel()

label.text = " "

label.font = UIFont.systemFontOfSize(14)

label.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

return label

}()

lazy var fengGeLine : UIView = {

let line = UIView()

line.backgroundColor = UIColor.init(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 1.0)

return line

}()

lazy var AddressTextField : UITextField = {

let text = UITextField()

text.placeholder = "詳細地址(請精確房門號)"

text.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

return text

}()

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// Dispose of any resources that can be recreated.

}

//MARK: -添加地址選擇器

func addPickView() {

self.view.addSubview(likeToolView)

likeToolView.addSubview(sureBtn)

likeToolView.addSubview(topViewLine)

likeToolView.addSubview(cancelBtn)

self.view.addSubview(cityPickView)

cityPickView.snp_makeConstraints { (make) in

make.top.equalTo(likeToolView.snp_bottom)

make.leading.equalTo(likeToolView.snp_leading)

make.trailing.equalTo(likeToolView.snp_trailing)

make.height.equalTo(160)

}

cancelBtn.snp_makeConstraints { (make) in

make.centerY.equalTo(likeToolView.snp_centerY)

make.leading.equalTo(likeToolView.snp_leading).offset(20)

}

sureBtn.snp_makeConstraints { (make) in

make.centerY.equalTo(likeToolView.snp_centerY)

make.trailing.equalTo(likeToolView.snp_trailing).offset(-20)

}

likeToolView.snp_makeConstraints { (make) in

make.top.equalTo(self.view.snp_bottom)

make.leading.equalTo(self.view.snp_leading)

make.trailing.equalTo(self.view.snp_trailing)

make.height.equalTo(44)

}

topViewLine.snp_makeConstraints { (make) in

make.top.equalTo(likeToolView.snp_top)

make.leading.equalTo(likeToolView.snp_leading)

make.trailing.equalTo(likeToolView.snp_trailing)

make.height.equalTo(1)

}

}

lazy var likeToolView : UIView = {

let view = UIView()

//? ? ? ? view.backgroundColor = UIColor.init(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 1.0)

view.backgroundColor = UIColor.whiteColor()

return view

}()

lazy var sureBtn : UIButton = {

let btn = UIButton()

btn.setTitle("確定", forState: UIControlState.Normal)

btn.setTitleColor(UIColor.init(r255: 41, g255: 196, b255: 117), forState: UIControlState.Normal)

btn.addTarget(self, action: #selector(ChangeHomeAddressVC.sureClick), forControlEvents: UIControlEvents.TouchUpInside)

btn.sizeToFit()

return btn

}()

lazy var cancelBtn : UIButton = {

let btn = UIButton()

btn.setTitle("取消", forState: UIControlState.Normal)

btn.setTitleColor(UIColor.init(r255: 165, g255: 165, b255: 165), forState: UIControlState.Normal)

btn.addTarget(self, action: #selector(ChangeHomeAddressVC.cancelBtnClick), forControlEvents: UIControlEvents.TouchUpInside)

return btn

}()

lazy var cityPickView : UIPickerView = {

let view = UIPickerView()

view.delegate = self

view.dataSource = self

//? ? ? ? view.backgroundColor = UIColor.yellowColor()

return view

}()

lazy var topViewLine : UIView = {

let view = UIView()

view.backgroundColor = UIColor.init(r255: 165, g255: 165, b255: 165)

return view

}()

//MARK: -pickerView

func getSubViews(view:UIView) {

for subView in view.subviews {

if subView.subviews.count != 0 {

self.getSubViews(subView)

}else {

if subView.frame.size.height <= 1 {

subView.backgroundColor = UIColor.init(r255: 41, g255: 196, b255: 117)

subView.alpha = 0.5

}

}

}

}

func sureClick() {

print("點擊了確認按鈕")

UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

self.likeToolView.hidden = true

self.cityPickView.hidden = true

self.likeToolView.transform = CGAffineTransformIdentity

self.cityPickView.transform = CGAffineTransformIdentity

},completion: nil)

}

func cancelBtnClick() {

print("點擊了取消按鈕")

UIView.animateWithDuration(1.25, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 5, options: UIViewAnimationOptions(rawValue:0), animations: {

self.addressLabel.text = "省市區"

self.addressLabel.textColor = UIColor.init(red: 165.0/255.0, green: 165.0/255.0, blue: 165.0/255.0, alpha: 1.0)

}) { (_) in

self.likeToolView.hidden = true

self.cityPickView.hidden = true

self.likeToolView.transform = CGAffineTransformIdentity

self.cityPickView.transform = CGAffineTransformIdentity

}

}

//解析plist文件

func getPickerData(){

let path = NSBundle.mainBundle().pathForResource("Address", ofType: "plist")

self.pickerDic = NSDictionary.init(contentsOfFile: path!)

self.provinceArray = self.pickerDic.allKeys

self.selectedArray = self.pickerDic.objectForKey(self.pickerDic.allKeys[0]) as! NSArray

if (self.selectedArray.count > 0){

self.cityArray = self.selectedArray[0].allKeys

}

if (self.cityArray.count > 0){

self.townArray = self.selectedArray[0].objectForKey(self.cityArray[0]) as! NSArray

}

}

//MARK:-pickerView代理方法

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

return 3

}

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {

self.getSubViews(pickerView)

var pickerLabel = UILabel()

pickerLabel = UILabel.init()

//? ? ? ? pickerLabel.font = UIFont(name: "Helvetica", size: 8)

pickerLabel.font = UIFont.systemFontOfSize(16)

pickerLabel.adjustsFontSizeToFitWidth = true

pickerLabel.textAlignment = .Left

pickerLabel.backgroundColor = UIColor.clearColor()

pickerLabel.text = self.pickerView(pickerView, titleForRow: row, forComponent: component)

return pickerLabel

}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

if (component == 0) {

return self.provinceArray.count;

} else if (component == 1) {

return self.cityArray.count

} else {

return self.townArray.count

}

}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

if (component == 0) {

//return [self.provinceArray objectAtIndex:row];

return self.provinceArray[row] as? String

} else if (component == 1) {

return self.cityArray[row] as? String;

} else {

return self.townArray[row] as? String;

}

}

func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {

if (component == 0) {

return 110;

} else if (component == 1) {

return 100;

} else {

return 110;

}

}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

if (component == 0) {

self.selectedArray = self.pickerDic.objectForKey(self.provinceArray[row]) as! NSArray

if (self.selectedArray.count > 0) {

self.cityArray = self.selectedArray[0].allKeys

} else {

self.cityArray = nil;

}

if (self.cityArray.count > 0) {

self.townArray = self.selectedArray[0].objectForKey(self.cityArray[0]) as! NSArray

} else {

self.townArray = nil;

}

pickerView.selectRow(0, inComponent: 1, animated: true)

}

pickerView.selectedRowInComponent(1)

pickerView.reloadComponent(1)

pickerView.selectedRowInComponent(2)

if (component == 1) {

if (self.selectedArray.count > 0 && self.cityArray.count > 0) {

self.townArray = self.selectedArray[0].objectForKey(self.cityArray[row]) as! NSArray

} else {

self.townArray = nil;

}

pickerView.selectRow(0, inComponent: 2, animated: true)

}

pickerView.reloadComponent(2)

//? ? ? ? provinceBtn.setTitle(self.provinceArray[self.myPicker.selectedRowInComponent(0)] as? String, forState:.Normal)

addressLabel.text = (self.provinceArray[self.cityPickView.selectedRowInComponent(0)] as? String)!

cityLabel.text =? (self.cityArray[self.cityPickView.selectedRowInComponent(1)] as? String)!

districtLabel.text =? (self.townArray[self.cityPickView.selectedRowInComponent(2)]as? String)!

addressLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

cityLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

districtLabel.textColor = UIColor.init(red: 51.0/255.0, green: 51.0/255.0, blue: 51.0/255.0, alpha: 1.0)

}

}

效果圖如下


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容