Es gibt vier Stufen, hier - wir einige Konstanten eingerichtet werden, die Picker Ansicht Daten und halten Bit der Konfiguration, dann fügen wir UIPickerViewDataSource
und UIPickerViewDelegate
Methoden hinzu, und wir werden mit der viewDidLoad
Initialisierung enden.
Zuerst wird die Konfiguration:
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
Notiere die pickerViewMiddle
konstant - es berechnet es sehr einfach zu machen unseren aktuellen Wert aus der Reihe versetzt zu bekommen. Auf die Datenquelle - wir wirklich nur einen Titel für jede Zeile zur Verfügung stellen müssen, aber wir werden eine Hilfsmethode fügen Sie eine Zeilennummer auf einen Wert aus dem Array zu konvertieren:
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))"
}
}
Und schließlich: ‚Wir ll eingerichtet, um die Delegierten:
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)")
}
}
zu initialisieren, in Ihrem viewDidLoad
gesetzt den Delegierten und Datenquelle und dann in der Mitte des Picker auf die richtige Zeile bewegen:
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)
Dank! Es funktioniert perfekt! – ThomasGulli
Wie in [diese Antwort] (http://stackoverflow.com/a/367436/172218) erwähnt, wird bei der Einstellung der Anzahl der Zeilen im Picker auf "jede große Zahl" VoiceOver mit "[Element] von [große Zahl ] ", was ein Zugänglichkeitsproblem ist. Irgendwie in der Nähe? –
Hallo, Nate! Wo deklarieren Sie Ihre Konfiguration? Ich habe es in meiner Klasse deklariert, aber geben Sie mir einen Fehler mit Instanz kann nicht in meiner Klasse verwendet werden. –