Sẽ có bốn bước ở đây - chúng tôi sẽ thiết lập một số hằng số để giữ dữ liệu xem bảng chọn và một bit cấu hình, sau đó chúng tôi sẽ thêm các phương thức UIPickerViewDataSource
và UIPickerViewDelegate
và chúng tôi sẽ kết thúc bằng việc khởi tạo viewDidLoad
.
Thứ nhất, cấu hình:
private let pickerViewData = Array(0...59) // contents will be 0, 1, 2, 3...59, change to whatever you want
private let pickerViewRows = 10_000 // any big number
private let pickerViewMiddle = ((pickerViewRows/pickerViewData.count)/2) * pickerViewData.count
Lưu ý pickerViewMiddle
liên tục - đó là tính toán để làm cho nó rất dễ dàng để có được giá trị hiện tại của chúng tôi từ hàng bù đắp. Vào các nguồn dữ liệu - chúng tôi thực sự chỉ cần cung cấp một tiêu đề cho mỗi hàng, nhưng chúng tôi sẽ thêm một phương pháp helper để chuyển đổi một số hàng để một giá trị từ mảng:
extension ViewController : UIPickerViewDataSource {
func valueForRow(row: Int) -> Int {
// the rows repeat every `pickerViewData.count` items
return pickerViewData[row % pickerViewData.count]
}
func rowForValue(value: Int) -> Int? {
if let valueIndex = find(pickerViewData, value) {
return pickerViewMiddle + value
}
return nil
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return "\(valueForRow(row))"
}
}
Và cuối cùng chúng tôi ll thiết lập các đại biểu:
extension ViewController : UIPickerViewDelegate {
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerViewRows
}
// whenever the picker view comes to rest, we'll jump back to
// the row with the current value that is closest to the middle
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let newRow = pickerViewMiddle + (row % pickerViewData.count)
pickerView.selectRow(newRow, inComponent: 0, animated: false)
println("Resetting row to \(newRow)")
}
}
để khởi tạo, trong viewDidLoad
bạn thiết lập các đại biểu và nguồn dữ liệu và sau đó di chuyển đến hàng đúng ở giữa bảng chọn của bạn:
self.picker.delegate = self
self.picker.dataSource = self
let initialValue = 0
if let row = rowForValue(initialValue) {
self.picker.selectRow(row, inComponent: 0, animated: false)
}
// or if you just want to start in the middle:
// self.picker.selectRow(pickerViewMiddle, inComponent: 0, animated: false)
Cảm ơn! Nó hoạt động hoàn hảo! – ThomasGulli
Như đã đề cập trong [câu trả lời này] (http://stackoverflow.com/a/367436/172218) thiết lập số hàng trong bộ chọn cho "bất kỳ số lớn" nào lên VoiceOver, cho "[item] của [số lớn ] ", đây là sự cố trợ năng. Bất kỳ cách nào xung quanh điều này? –
Xin chào, Nate! Bạn khai báo cấu hình của mình ở đâu? Tôi tuyên bố nó ở lớp của tôi, nhưng cho tôi một lỗi với ví dụ không thể được sử dụng trong lớp học của tôi. –