web-dev-qa-db-fra.com

Sélectionner la ligne après le chargement de UIPickerView

J'ai une application de base de données iPhone qui charge une UIPickerView avec les données d'une table. Je souhaite définir la ligne sélectionnée sur une ligne particulière à partir des données d'une autre table.

Par exemple: supposons que j'ai une UIPickerView chargée avec un nombre X de noms d'amis d'amis d'utilisateurs (le nombre de noms est variable; il peut être égal à 1 ou 1 000 et tous sont entrés dans la base de données par l'utilisateur). L'utilisateur de l'iPhone a défini une préférence pour que son meilleur ami actuel soitTED. Je veux que UIPickerView soit positionné surTEDlorsqu’il est affiché.

Où est-ce que j'appelle selectRow?

J'ai essayé dans viewDidAppear, mais il n'a jamais été appelé, dans titleForRow, ce qui a provoqué toutes sortes de comportements étranges. viewDidLoad et viewWillAppear sont hors de question, car je ne sais pas encore ce qu'il y a dans la source de données du sélecteur.

71
Steve Gibson

Appelez-le après avoir récupéré les données. Je ne sais pas où vous chargez les données, il ne s'agit donc que d'une maquette de ce qui devrait fonctionner. Si cela n’a aucun sens, dites-moi où vous chargez les données pour que je puisse les rassembler dans ma tête :)

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

Il existe un problème courant lorsqu'un élément UIPickerView (par défaut) doit être sélectionné lors de l'affichage initial de UIPickerView. Le problème est lié à la séquence des événements. A la lecture des publications précédentes, il semble que le [pickerView selectRow: n] soit normalement appelé dans l'événement ViewDidLoad des contrôleurs de vue. Toutefois, les données UiPickerView ne sont chargées qu'après l'événement ViewDidLoad, ce qui signifie que tout code de sélection dans ViewDidLoad n'aura aucun effet. Pour y remédier, placez le code de sélection dans ViewDidAppear;

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

Placez ceci partout où vous initialisez la UIView contenant votre UIPickerView en tant que sous-vue:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];
7
Alex Reynolds

Je viens de constater que sur le SDK 4.3, les comportements de chargement des composants sont différents entre l'iPhone et l'iPad. Sur l'iPhone, j'étais sur le point d'appeler selectRow: juste après l'initialisation de la vue, avant ou après l'ajout à la hiérarchie de sous-vues. Sur iPad, l’appel selectRow n’a donné aucun résultat. Je me suis retrouvé avec un performSelector: withObject: afterDelay: appel à attendre 0,1 seconde avant de tirer selectRow: inComponent: animated :. Cela a eu des résultats prévisibles sur l'iPhone et l'iPad.

4
Blake Watters

Pour Swift c'est simplement:

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

Si vous voulez que la ligne sélectionnée soit en surbrillance en permanence, utilisez cette option. 

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