Zeile auswählen Nachdem UIPickerView geladen wurde


77

Ich habe eine iPhone-Datenbank-App, die eine UIPickerViewmit Daten aus einer Tabelle lädt . Ich möchte die ausgewählte Zeile aus den Daten in einer anderen Tabelle auf eine bestimmte Zeile setzen.

Zum Beispiel: Angenommen, ich habe eine UIPickerView, die mit X Namen der Freunde der iPhone-Benutzer geladen ist (die Anzahl der Namen ist variabel; sie kann 1 oder 1000 sein und alle werden vom Benutzer in die Datenbank eingegeben). Der iPhone-Benutzer hat eine Voreinstellung festgelegt, dass sein derzeit bester Freund TED ist . Ich möchte UIPickerView, dass die Position bei Anzeige auf TED gesetzt wird.

Wo rufe ich an selectRow?

Ich habe es versucht viewDidAppear, aber es wurde nie aufgerufen, titleForRowwas zu allerlei seltsamem Verhalten führte. viewDidLoadund viewWillAppearkommen nicht in Frage, weil ich noch nicht weiß, was in der Datenquelle für den Picker ist.


Fügen Sie einfach den @ Punjab-Code in seine Antwort ein, nachdem Sie Daten geladen und den Delegierten angegeben haben. Das hat bei mir funktioniert!
Anurag Sharma

Antworten:


140

Rufen Sie es auf, nachdem Sie die Daten abgerufen haben. Ich weiß nicht, wo Sie die Daten laden, daher ist dies nur ein Modell dessen, was funktionieren sollte. Wenn dies keinen Sinn ergibt, lassen Sie mich wissen, wo Sie Daten laden, damit ich sie in meinem Kopf zusammenfügen kann :)

-(void)viewDidLoad
{
    // load data from sql
    // self.someDataArray = DATAFROMSQL
    [picker reloadAllComponents];
    [picker selectRow:0 inComponent:0 animated:YES];
}

Vielen Dank, ich rufe die Daten in viewDidLoad genau wie Ihr Modell ab. Ich musste eine Methode erstellen, um die Liste aufzulisten, um den Übereinstimmungsindex zu finden, und dann die Auswahl festlegen. Ich dachte, ich hätte vielleicht einen Rückruf verpasst, der verwendet werden könnte, nachdem der Picker geladen wurde und bevor ich zur Ereignisschleife zurückkehrte.
Steve Gibson

es funktioniert, aber warum verursacht es so viel Verzögerung beim Laden der Ansicht? (in einer Tab-
Leisten-

@Jab deine Antwort ist richtig bevor selectRowdu anrufst vergiss den Anruf nicht reloadAllComponents!!!!
Hattori Hanzō

44

Es tritt häufig ein Problem auf, wenn ein (Standard-) UIPickerView-Element ausgewählt werden muss, wenn UIPickerView zum ersten Mal angezeigt wird. Das Problem hängt mit der Abfolge der Ereignisse zusammen. Aus dem Lesen früherer Beiträge geht hervor, dass [pickerView selectRow: n] normalerweise im ViewDidLoad-Ereignis des View Controllers aufgerufen wird. Die UiPickerView-Daten werden jedoch erst nach dem ViewDidLoad-Ereignis geladen. Dies bedeutet, dass Auswahlcodes in ViewDidLoad keine Auswirkung haben. Um dies zu beheben, platzieren Sie den Auswahlcode in ViewDidAppear.

- (void) viewDidAppear:(BOOL)animated {
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; }

7

Platzieren Sie dies überall dort, wo Sie das initialisieren UIView, das Ihre UIPickerViewals Unteransicht enthält:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];

4

Ich habe gerade festgestellt, dass das Ladeverhalten der Komponenten in den 4.3 SDKs zwischen dem iPhone und dem iPad unterschiedlich ist. Auf dem iPhone wollte ich selectRow aufrufen: direkt nach dem Initialisieren der Ansicht vor oder nach dem Hinzufügen zur Unteransichtshierarchie. Auf dem iPad ergab der Aufruf von selectRow jedoch keine Ergebnisse. Ich habe einen performSelector: withObject: afterDelay: -Aufruf ausgeführt, um 0,1 Sekunden zu warten, bevor selectRow: inComponent: animiert: ausgelöst wird. Dies hatte vorhersehbare Ergebnisse auf dem iPhone und iPad.


3

Für Swift ist es einfach:

self.picker?.selectRow(0, inComponent: 0, animated: true)

0

Wenn Sie möchten, dass die ausgewählte Zeile dauerhaft hervorgehoben wird, verwenden Sie diese Option

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.