pickerview 問題:當快速滑動滾輪時畫面選取的 row 和偵測選擇的 row 不同

Patty
4 min readOct 14, 2021

--

當畫面選取和偵測選取不一致可能會導致寫程式時邏輯錯誤,也會讓使用者困惑。

碰到的問題

發現如果快速滑動滾輪後,畫面灰色底所選取的列可能會和偵測滾輪選取的列不同。(範例是透過下方文字顯示偵測滾輪選取的列)

滾輪設置

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()
}

--

--

No responses yet