iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
Mobile Development

《菜鳥のSwift》持續30天開發挑戰系列 第 17

《DAY 17》選取器

選取器可以讓使用者從一份清單中選取需要的項目,寫法和表格類似,它一樣有三階段的對話函數。

首先在手機畫面中放入一個 Picker View 元件,再用藍線設定 Picker View 元件在 View Controller 上的 dataSource 與 delegate。
https://ithelp.ithome.com.tw/upload/images/20200930/20129680Q6hOUeTgbL.png

在 ViewController 裡宣告我們要顯示的資料。

class ViewController: UIViewController {
    
    let location = ["台北","新北","桃園","台中","台南","高雄"]
    let temperature = ["30°C","31°C","32°C","33°C","34°C"]
    var a,b:String? // 用來存地點與溫度,下面有一個函數會用到

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

讓 ViewController 的類別符合 UIPickerViewDataSource 與 UIPickerViewDelegate 協定的規範。

extension ViewController: UIPickerViewDataSource, UIPickerViewDelegate {
}

一開始會看到 Xcode 報錯,因為我們還沒有寫三階段的對話函數,按下 Fix 可以直接幫我們新增前兩個函數。

  • 第一階段對話,Picker View 有幾個滾輪。
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}
  • 第二階段對話,Picker View 每個滾輪有幾筆資料。
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        // 最左邊的滾輪
        return location.count
    }
    else {
        // 最左邊以外的滾輪
        return temperature.count
    }
}
  • 第三階段對話,Picker View 內每筆資料的實際內容。
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return location[row]
    }
    else {
        return temperature[row]
    }
}

如此一來就可以正確呈現資料了。
https://ithelp.ithome.com.tw/upload/images/20200930/201296800g2TjONTtw.png

  • 如果選取某筆資料要執行某件事,實作以下函數。
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        
    if component == 0 {
        a = location[row]
    }
    else {
        b = temperature[row]
    }
    if a != nil && b != nil {
        print(a! + b!) // 當 a、b 不為空時會出現類似"台北32°C"的字串在除錯區
    }
}

切記不要把 a、b 宣告在上方函數內,這樣每次選取都會重新宣告 a、b。

另外還有一個常遇到的問題,當資料內容過長時,會無法全部顯示,可以在下面函數內調整指定滾輪的寬度。

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

上一篇
《DAY 16》我的第一個小遊戲 App,1A2B 猜數字遊戲(完)
下一篇
《DAY 18》實作彈出選取器
系列文
《菜鳥のSwift》持續30天開發挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言