import UIKit //UIPickerView 的委托協議是 UIPickerViewDelegate,數據源是 UIPickerViewDataSource。我們需要在視圖控制器中聲明實現 UIPiekerViewDelegate 和 UIPickerViewDataSource 協議。 class RootViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { var label: UILabel! var pickerView: UIPickerView! var pickerData:[String: [String]] = ["放假":["寫代碼","玩游戲","泡妹子"],"旅游":["馬爾代夫","火星","迪拜","月球"],"上班":["加班","不加班"]] //保存全部數據 var pickerProvincesData: [String] = ["放假","旅游","上班"] //第一級數據 var pickerCitiesData: [String] = ["寫代碼","玩游戲","泡妹子"]//第二級數據 override func viewDidLoad() { super.viewDidLoad() // 創建視圖 let screen = UIScreen.main.bounds // 設置 根視圖背景色 self.view.backgroundColor = UIColor.white // 選擇器 let pickerViewWidth:CGFloat = 320 let pickerViewHeight:CGFloat = 162 self.pickerView = UIPickerView(frame: CGRect(x:0, y: 0,width: pickerViewWidth, height: pickerViewHeight)) //因為該Controller中實現了UIPickerViewDataSource接口所以將dataSource設置成自己 self.pickerView.dataSource = self //將delegate設置成自己 self.pickerView.delegate = self self.view.addSubview(self.pickerView) // 添加標簽 let labelwidth:CGFloat = 200 let labelheight:CGFloat = 21 let labelTopView:CGFloat = 281 self.label = UILabel(frame: CGRect(x:(screen.size.width - labelwidth)/2, y: labelTopView, width: labelwidth, height: labelheight)) self.label.text = "Label" // 字體左右居中 self.label.textAlignment = .center self.view.addSubview(self.label) // button 按鈕 let button = UIButton(type: .system) button.setTitle("Button", for: UIControlState.normal) let buttonwidth:CGFloat = 46 let buttonheight:CGFloat = 30 let buttonTopView:CGFloat = 379 button.frame = CGRect(x: (screen.size.width - buttonwidth)/2, y: buttonTopView, width: buttonwidth, height: buttonheight) //事件 button.addTarget(self, action: #selector(onclick(_:)), for: .touchUpInside) self.view.addSubview(button) } //設置選擇框的總列數,繼承於UIPickViewDataSource協議 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 2 } //設置選擇框的總行數,繼承於UIPickViewDataSource協議 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { //總行數設置為數據源的總長度。component :為0 表示第一列,1 表示第二列 //根據不同的數據源設置不同的個數 if(component == 0){ return self.pickerProvincesData.count }else{ return self.pickerCitiesData.count } } //設置選項框各選項的內容,繼承於UIPickViewDelegate協議 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{ if(component == 0){ //選擇第一級數據 return self.pickerProvincesData[row] } else{//選擇第二級數據 return self.pickerCitiesData[row] } } //選擇控件的事件選擇 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if(component == 0){ //記錄用戶選擇的值 let selectedProvince = self.pickerProvincesData[row] as String // 根據第一列選擇的值,獲取第二列數據 self.pickerCitiesData = self.pickerData[selectedProvince]! //刷新第二列的數據源 self.pickerView.reloadComponent(1) //刷新數據源后將第二組數據轉到下標為0,並且開啟動畫效果 self.pickerView.selectRow(0, inComponent: 1, animated: true) } } //設置每行選項的高度 func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 45.0 } // 獲取值 @objc func onclick(_ sender: AnyObject) { //獲得2列選取值的下標 let row1 = self.pickerView.selectedRow(inComponent: 0) let row2 = self.pickerView.selectedRow(inComponent: 1) // 根據下標獲取值 let selected1 = self.pickerProvincesData[row1] as String let selected2 = self.pickerCitiesData[row2] as String //拼接值 let title = String(format: "%@, %@", selected1, selected2) self.label.text = title } }