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.
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];
}
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]; }
Placez ceci partout où vous initialisez la UIView
contenant votre UIPickerView
en tant que sous-vue:
[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];
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.
Pour Swift c'est simplement:
self.picker?.selectRow(0, inComponent: 0, animated: true)
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;