當畫面選取和偵測選取不一致可能會導致寫程式時邏輯錯誤,也會讓使用者困惑。
碰到的問題
發現如果快速滑動滾輪後,畫面灰色底所選取的列可能會和偵測滾輪選取的列不同。(範例是透過下方文字顯示偵測滾輪選取的列)
滾輪設置
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 3
}func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return 24
} else {
return 60
}
}func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
return row.description
} else {
return row.description
}
}
文字顯示選取的列
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
hour = row.description
} else if component == 1 {
min = row.description
} else if component == 2 {
sec = row.description
}
// 選擇的時間以字串顯示
timeToString()
}func timeToString(){
// 選擇的時間以字串顯示
formatter.dateFormat = "HH:mm:ss"
guard let time = formatter.date(from: "\(hour):\(min):\(sec)") else { return }
let timeToString = formatter.string(from: time)
timeLabel.text = "\(timeToString)\n\n第一列:\(timePickerview.selectedRow(inComponent: 0))\n第二列:\(timePickerview.selectedRow(inComponent: 1))\n第三列:\(timePickerview.selectedRow(inComponent: 2))"
}
目前解決方式
滾輪滑動後,將畫面移動到偵測選取的 row ,避免兩者不一致。
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
hour = row.description
} else if component == 1 {
min = row.description
} else if component == 2 {
sec = row.description
}
// 將畫面移動至偵測選取的row
timePickerview.selectRow(row, inComponent: component, animat ed: false)
// 選擇的時間以字串顯示
timeToString()
}