Récupérer le contenu du 1er objet de mon Pickerview sans changer l'index
Bonjour,
Je vous explique la situation:
J'ai un bouton avec pour titre "Sélectionnez" qui au clic me renvoie vers un UIPickerView qui contient X objets.
J'ai bien évidemment 2 boutons sur mon PickerView: "Annuler" et "Valider".
Au clic sur Annuler il réinitialise le titre du bouton et lui affecter "Sélectionnez" comme titre.
Le "problème" viens du bouton valider. Il affiche bien mon objet comme titre du bouton quand on change l'index, mais imaginons que je souhaite que le titre de mon bouton soit le 1er objet (à l'index 0) je suis obligé de passer à l'index 1, puis de revenir à l'index 0 pour avoir l'objet comme titre.
N'y a t-il pas un moyen de faire en sorte que dès le début quand je clique sur valider cela me mettre l'objet 0 comme titre s'il vous plait ?
Voila mon code actuel:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
//Récupération du nombre d'agences à partir du webService
int nbAgences = [[_listeAgencesConnexion objectForKey:@nbAgences] intValue];
return nbAgences;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
[selectionAgence setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
NSString *numeroLigne = [NSString stringWithFormat: @%ld, (long)row];
NSString *titreAgence = _listeAgencesConnexion[numeroLigne];
[selectionAgence setTitle:titreAgence forState:UIControlStateNormal];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel* tView = (UILabel*)view;
if (!tView)
{
tView = [[UILabel alloc] init];
[tView setFont:[UIFont fontWithName:@Raleway-Medium size:20]];
[tView setTextAlignment:NSTextAlignmentCenter];
}
NSString *numeroLigne = [NSString stringWithFormat: @%ld, (long)row];
tView.text = _listeAgencesConnexion[numeroLigne];
return tView;
}
- (IBAction)selectionnerAgence:(id)sender {
[self.pickerViewTextField becomeFirstResponder];
}
- (void)cancelTouched:(UIBarButtonItem *)sender
{
[self.pickerViewTextField resignFirstResponder];
[selectionAgence setTitle:@Sà‰LECTIONNEZ VOTRE AGENCE forState:UIControlStateNormal];
}
- (void)doneTouched:(UIBarButtonItem *)sender
{
[self.pickerViewTextField resignFirstResponder];
}
Merci d'avance pour l'aide
Réponses
Peut être qu'en utilisant la propriété selectedRowInComponent: d'un pickerView tu pourrais retourner la ligne qui est sélectionnée ?
Donc dans ta méthode doneTouched:
tView.text = _listeAgencesConnexion[self.pickerViewTextField selectedRowInComponent:0 ];
Ou un truc dans le genre ?
J'en suis pas convaincu, d'autant plus que dans ton cas précis il affiche tout le temps l'objet à la position 0, hors quand c'est l'objet à une position différente de 0 je veut récupérer l'index et non 0.
Cependant merci d'avoir essayé de m'aider
euh non, selectedRowInComponent:0 renvoie l'index sélectionné dans le composant 0, car tu peux avoir plusieurs composants dans un pickerView (un peu comme pour le datePickerView qui en à trois, le jour, le mois et l'année).
Donc ici, il renverra bien un entier correspondant à la ligne. Après à toi de voir si il s'agit du composant 0 ou 1 (si tu as deux composants dans ton pickerView).
J'ai qu'un seul composant dans mon PickerView
Après avoir testé ce que tu m'a dit je ne vois pas vraiment comment faire.
En effet cette ligne (ci dessous) me met une erreur
UILabel* tView = (UILabel*)view;
Quelle erreur ? Il faut nous donner plus d'information
Voila le message d'erreur quand je met la ligne ci-dessus dans le bouton doneTouched
c'est que la vue "view" n'existe simplement pas
D'ailleurs pourquoi ne pas simplement déclarer en variable de classe ton label, et ensuite de changer à ta guise sa proprité text? cela t'éviterait de faire tout ça :
C'est à dire, peut tu être plus précis, et donner un exemple concret s'il te plait ?
Et d'où provient 'view' ? C'est pas déclaré dans cette méthode.
Bah j'ai repris le code qui était mis dans le
dans lequel il y a effectivement une vue, mais du coup le mettre ailleurs dans un endroit où il n'y a pas de vue ça pose problème
oui c'est complètement normal vu que cet objet n'est accessible uniquement dans cette méthode. Etant moi-même vraiment débutant je ne peux que te conseiller de revoir les bases de la programmation en objective-C, car là il s'agit réellement de base que tu devrais maitriser avant d'aller plus loin
Il y a de très bon tutoriaux sur internet, personnellement ce sont mes bibles c'est temps-ci, et je te conseil d'en lire un maximum !
J'ai fait des recherches sur Internet sans trouver aucune réponse à ce sujet.
Et c'est vraiment le dernier détail restant, avant que mon application soit entièrement fonctionnelle.
Essaie de créer une variable de classe de ton label. Dans le .h de ton contrôler :
ensuite modifie le reste comme suit :
Hello,
Merci Romhein, mais il n'existe pas la propriété selectedRowInComponent sur le pickerViewTextField (qui comme son nom l'indique est un UITextField).
Les seuls moments ou le UIPickerView c'est dans le viewDidLoad ou il y a ces lignes la:
Mon collègue ayant fait ça, n'a pas jugé utile de créer une propriété de type UIPickerView, je me demande si c'est un bon choix ou pas.
J'ai bien essayé comme dit ici http://stackoverflow.com/questions/5125030/uipicker-noob-question-if-i-click-on-first-item-in-the-picker-the-result-is-n/20042414#20042414, mais sans aucun résultat différent
mea culpa, j'avais lu les premières syllabes ^^. Effectivement ça serait peut-être pas mal de l'avoir au moins en classe, pas forcement en propriété puisque je doute que tu en aies besoin en dehors. Et du coup remplace la ligne avec self.pickerViewTextField, avec l'instance de ton pickerView.
Ok merci j'essaye ça et je te tiens au courant
Jean, peux-tu nous montrer une capture d'écran de ta vue ?
_listeAgencesConnexion c'est un nsarray ou un nsdictionary ?
Le message d'erreur est explicite, un NSDictionary n'est pas ordered, tu ne peux pas accéder à un element via son index.
Donc faut rajouter une clef dans ton dictionnaire pour le tri.
Pour dans le didSelectRow, le collègue n'a passé aucune clé
Et pourtant il n'a aucune erreur
Bon c'est un peu capilotracté mais j'ai réussi en faisant ça
C'est quoi les clefs de ton dictionnaire ?
pour une liste de ville, perso j'aurai utilisé un NSArray, ça évite de passer le row en string, et de créer une variable à chaque fois pour pas grand chose. Enfin après on connait pas bien tes besoins.
Aucune idée comme dit précédemment je reprends le code de mon collègue
Il n'y a aucun commentaire dans le code ? ::)