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).


  • Jean75Jean75 Membre
    décembre 2014 modifié #5

    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;

  • Joanna CarterJoanna Carter Membre, Modérateur

    Quelle erreur ? Il faut nous donner plus d'information



  • Use of undeclared identifier 'view'

    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 : 



    if (!tView)
    {
    tView = [[UILabel alloc] init];
    [tView setFont:[UIFont fontWithName:@Raleway-Medium size:20]];
    [tView setTextAlignment:NSTextAlignmentCenter];
    }
  • C'est à  dire, peut tu être plus précis, et donner un exemple concret s'il te plait ?


  • Joanna CarterJoanna Carter Membre, Modérateur



    Use of undeclared identifier 'view'

    Voila le message d'erreur quand je met la ligne ci-dessus dans le bouton doneTouched


     





    - (void)doneTouched:(UIBarButtonItem *)sender
    {
    [self.pickerViewTextField resignFirstResponder];
    }

    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



    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

    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


  • RomheinRomhein Membre
    décembre 2014 modifié #12


    Bah j'ai repris le code qui était mis dans le



    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

    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.


  • RomheinRomhein Membre
    décembre 2014 modifié #14

    Essaie de créer une variable de classe de ton label. Dans le .h de ton contrôler : 



    @interface TonViewController : UIViewController <UIPickerViewDelegate>
    {

    UIButton *TonBouton; //celui qui affiche le contenu de tes pickers view
    }

    ensuite modifie le reste comme suit :



    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
    {
    // cette méthode ne correspond pas vraiment à  ce que tu veux faire si j'ai bien compris, puisqu'elle permet de costumiser ton pickerView, et nom ton label ou bouton de ton controller
    }

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
    //essaye plutôt celle-là  qui réagit aux changement de sélection de l'utilisateur.
    NSString *numeroLigne = [NSString stringWithFormat: @%ld, (long)row];
    tonBouton.text = _listeAgencesConnexion[numeroLigne];

    }

    - (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
    {
    tonBouton.text = _listeAgencesConnexion[self.pickerViewTextField selectedRowInComponent:0 ];
    [self.pickerViewTextField resignFirstResponder];
    }

  • Jean75Jean75 Membre
    décembre 2014 modifié #15

    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:



    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;

    self.pickerViewTextField.inputView = pickerView;

    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


  • Joanna CarterJoanna Carter Membre, Modérateur

    Jean, peux-tu nous montrer une capture d'écran de ta vue ?



  • int selectedObject = [pickerView selectedRowInComponent:0];
        [selectionAgence setTitle:_listeAgencesConnexion[selectedObject] forState:UIControlStateNormal];

    Expected method to read array element not found on object of type 'NSDictionary *'

     



     


    502264Capturedcran20141219112638.png


  • _listeAgencesConnexion c'est un nsarray ou un nsdictionary ?



  • //NSDictionnary contenant le nom de toutes les agences
    @property(nonatomic,retain) NSDictionary* listeAgencesConnexion;
  • 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.

  • Jean75Jean75 Membre
    décembre 2014 modifié #23

    Pour dans le didSelectRow, le collègue n'a passé aucune clé



    NSString *numeroLigne = [NSString stringWithFormat: @%ld, (long)row];
    NSString *titreAgence = _listeAgencesConnexion[numeroLigne];
    [selectionAgence setTitle:titreAgence forState:UIControlStateNormal];


    Et pourtant il n'a aucune erreur


  • Bon c'est un peu capilotracté mais j'ai réussi en faisant ça ;)



    - (IBAction)selectionnerAgence:(id)sender {
        NSString *numeroZero = @"0";
        [selectionAgence setTitle:_listeAgencesConnexion[numeroZero] forState:UIControlStateNormal];
        [self.pickerViewTextField becomeFirstResponder];
    }
  • 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.




  • C'est quoi les clefs de ton dictionnaire ?




    Aucune idée comme dit précédemment je reprends le code de mon collègue

  • Joanna CarterJoanna Carter Membre, Modérateur

    Il n'y a aucun commentaire dans le code ?  ::)


Connectez-vous ou Inscrivez-vous pour répondre.