2009-05-01 1 views
69

Ich habe eine iPhone-Datenbank-App, die eine UIPickerView mit Daten aus einer Tabelle lädt. Ich möchte die ausgewählte Zeile auf eine bestimmte Zeile aus den Daten in einer anderen Tabelle festlegen.Zeile auswählen Nachdem UIPickerView geladen wurde

Zum Beispiel: Ich habe eine UIPickerView, die mit X geladen ist Anzahl der Namen der iPhone-Benutzer Freunde (die Anzahl der Namen ist variabel, könnte 1 oder 1000 sein und alle sind in der DB vom Benutzer eingegeben) . Der iPhone-Benutzer hat eine Voreinstellung eingestellt, dass sein derzeitig beste Freund TED ist. Ich möchte, dass die UIPickerView Position zu TED wird, wenn sie angezeigt wird.

Wo rufe ich selectRow an?

Ich versuchte in viewDidAppear, aber es wurde nie aufgerufen, in titleForRow, die alle Arten von seltsames Verhalten verursacht. viewDidLoad und viewWillAppear kommen nicht in Frage, weil ich noch nicht weiß, was in der Datenquelle der Picker ist.

Vielen Dank im Voraus.

+0

einfach den @jab Code in seiner Antwort setzt nach dem Laden von Daten und geben delegiert. Das hat für mich funktioniert! –

Antwort

134

Rufen Sie es, nachdem Sie die Daten abrufen. Ich weiß nicht, wo Sie die Daten laden, also ist dies nur ein Modell dessen, was funktionieren soll. Wenn dies keinen Sinn macht, lassen Sie mich wissen, wo Sie Daten geladen werden, damit ich sie zusammen in meinem Kopf Stück kann :)

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

Danke, ich retrive die Daten in der ViewDidLoad genau wie Ihr Modell. Ich musste eine Methode erstellen, um durch die Liste aufzulisten, um den Übereinstimmungsindex zu finden und dann die Auswahl festzulegen. Ich dachte, dass mir vielleicht ein Rückruf fehlte, der verwendet werden konnte, nachdem der Picker geladen wurde und bevor er zur Ereignisschleife zurückkehrte. –

+0

es funktioniert, aber warum verursacht es so viel Verzögerung beim Laden der Ansicht? (in einer Tab-Bar-Situation) – CularBytes

7

Platz dieses, wo Sie die UIView initialisieren, die Ihre UIPickerView als Subview enthält:

39

Es gibt ein häufiges Problem, wenn ein (Standard) UIPickerView Element ausgewählt werden muss, wenn das UIPickerView anfänglich angezeigt wird. Das Problem hängt mit der Reihenfolge der Ereignisse zusammen. Beim Lesen früherer Posts scheint der [PickerView selectRow: n] normalerweise im ViewDidLoad-Ereignis der View-Controller aufgerufen zu werden. Die UiPickerView-Daten werden jedoch erst nach dem ViewDidLoad-Ereignis geladen, was bedeutet, dass ein Auswahlcode in ViewDidLoad keine Auswirkung hat. Platzieren Sie den Auswahlcode in ViewDidAppear, um Abhilfe zu schaffen;

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

Ich habe gerade festgestellt, dass auf der 4.3 SDK die Komponenten Ladeverhalten zwischen dem iPhone und dem iPad unterschiedlich sind. 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 selectRow-Aufruf jedoch keine Ergebnisse. Ich habe mit einem performSelector beendet: withObject: afterDelay: call, um 0.1 Sekunden zu warten, bevor selectRow: inComponent: animated: ausgelöst wird. Dies hatte vorhersehbare Ergebnisse auf dem iPhone und iPad.

0

Wenn Sie die ausgewählten Zeilen wollen hervorgehoben dauerhaft verwenden diese

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor; 
1

Für swift es ist einfach

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