Des UIPickerView avec différentes valeurs

Bonjour,


J'ai 5 tableaux, et pour chacun d'eux je doit faire un PickerView contenant les infos du tableau


J'en ai créer un comme ci dessous


Comment créer les 4 autres? Je doit copier ce code 4 fois ?



- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return listeSuiviDossier.count;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSString *titrePickerview = listeSuiviDossier[row];
return titrePickerview;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
NSString *titrePickerview = listeSuiviDossier[row];
[suiviDossierBouton setTitle:titrePickerview forState:UIControlStateNormal];
}

- (IBAction)suiviDossierAction:(id)sender {
[self.pickerViewTextField becomeFirstResponder];
}

- (void)cancelTouched:(UIBarButtonItem *)sender
{
[self.pickerViewTextField resignFirstResponder];
[suiviDossierBouton setTitle:@Sélectionnez forState:UIControlStateNormal];
}

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

Merci d'avance à  ceux qui m'aideront :)


Réponses

  • Bonjour,


     


    Dupliquer le code que tu as écris ici dans une même classe ne marche pas. 


     


    Ce que tu as besoin de faire c'est afficher les bonnes données au bon moment. Dans ton cas par exemple, si tu disposes de 5 tableaux, effectuer des condition serait la méthode la plus simple à  imaginer. Toutefois je partirais d'un dictionnaire qui engloberait tes tableaux ou d'un tableau unique qui contiendrait tes 5 tableaux.


     


    Ce serait préférable quand même de penser à  un autre modèle que celui-là  pour facilité la maintenance. Qu'est ce qui arriverait si tu souhaites ajouter 2 autres tableaux ? Jouer sur les conditions aussi c'est fastidieux.


  • Et ça se présenterait comment au niveau du code ça s'i te plait ?


  • Un exemple possible :



    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
    if (pickerView == pickerSuiviDossier)
    {
    NSString *titrePickerview = listeSuiviDossier[row];
    return titrePickerview;
    }
    else if (pickerView = pickerAutre)
    {
    NSString *titrePickerview = listeAutre[row];
    return titrePickerview; 
    }
    else
    return @"";
    }

    C'est juste une manière de faire :


    Regarder de quel UIPickerView il s'agit si tu en as mis plusieurs.


    Si tu en as qu'un à  chaque fois de visible, tu peux mettre un if qui agira en fonction.  En ayant le même NSArray, mais en changeant son contenu.


  • Hello Larme,


     


    Je ne sais pas si je fais de la bonne manière pour créer mon pickerView, j'aimerais avoir confirmation (ou non).


    Voila ce que j'ai fait (j'ai repris le code de mon collègue, qui est débutant aussi)



    @property (nonatomic, strong) UITextField *pickerViewDossier;

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.pickerViewDossier = [[UITextField alloc] initWithFrame:CGRectZero];
        [self.view addSubview:self.pickerViewDossier];
        
        UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
        pickerView.showsSelectionIndicator = YES;
        pickerView.dataSource = self;
        pickerView.delegate = self;
        
        self.pickerViewDossier.inputView = pickerView;
        
        UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        toolBar.barStyle = UIBarStyleBlackOpaque;
        
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@Valider style:UIBarButtonItemStyleDone target:self action:@selector(doneTouched:)];
        
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@Annuler style:UIBarButtonItemStyleDone target:self action:@selector(cancelTouched:)];
        
        [toolBar setItems:[NSArray arrayWithObjects:cancelButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], doneButton, nil]];
        
        self.pickerViewDossier.inputAccessoryView = toolBar;

    self.listeSuiviDossier = [NSArray arrayWithObjects:@Vous-même, @Un confrère,nil];
    }

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    {
        return 1;
    }

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
        return listeSuiviDossier.count;
    }

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        NSString *titrePickerview = listeSuiviDossier[row];
        return titrePickerview;
    }

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        NSString *titrePickerview = listeSuiviDossier[row];
        [suiviDossierBouton setTitle:titrePickerview forState:UIControlStateNormal];
    }

    - (IBAction)suiviDossierAction:(id)sender {
        [self.pickerViewDossier becomeFirstResponder];
    }

    - (void)cancelTouched:(UIBarButtonItem *)sender
    {
        [self.pickerViewDossier resignFirstResponder];
        [suiviDossierBouton setTitle:@Sélectionnez forState:UIControlStateNormal];
    }

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

    C'est la bonne manière de faire ?


     


    Comment adapter cela si j'ai 5 UIPickerViews ?


  • Est-ce que tu veux vraiment afficher 5 PickerViewou bien afficher différentes données dans un seul et unique PickerView ?


    D'ailleurs, que contiennent tes tableaux ? Des Chaines de caractères ?


  • A vrai dire je veut faire au plus simple, donc si c'est plus simple un seul je suis preneur ;)


     


    Les tableaux ne contiennent que du texte (à  l'exception d'un).


     


    D'ailleurs une question me viens est-il possible de faire un tableau qui contient un NSString 6 int ?


  • Il contient quoi le dernier tableau ?


     


    Tu peux pour aller vite créer des méthodes qui te retournent chacune un tableau ( donc ici des chaines de caractères).


    Lorsque tu déclenche un évènement pour récupérer des données précises tu appelles la bonne méthode.


    Ainsi pas besoin de faire de conditions dans tes méthodes du protocol PickerView et tu gardes toujours ta property listeSuiviDossier comme tableau de référence.


  • Le dernier tableau est le suivant:



    self.listeGir = [NSArray arrayWithObjects:@Non connu, @1, @2,@3, @4, @5, @6,nil];

    Si je pouvais mettre les chiffres en int au lieu d'en string ça serait cool, ça m'éviterait de faire un intValue ^^


     


    Tu pourrais me donner un exemple simple de la méthode dont tu parles, car la je ne vois pas trop de quoi tu parles. Merci d'avance


  • MagiicMagiic Membre
    novembre 2014 modifié #10

    Ton tableau d'entier tu vas de toute les façons afficher en String sur ton Pickerview. 


     


    Pour ce qui est de la méthode, voici un exemple rapide de ce que tu peux faire. À toi de l'adapter.



    #import "ViewController.h"

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIPickerView *myPickerView;

    @property (nonatomic, strong) NSArray *itemsPickerView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.itemsPickerView = [self firstData];
    }

    - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }
    - (IBAction)mySegment:(id)sender {

    UISegmentedControl *segment = (UISegmentedControl*) sender;

    switch (segment.selectedSegmentIndex) {
    case 0:
    self.itemsPickerView = [self firstData];
    break;
    case 1:
    self.itemsPickerView = [self secondData];
    break;

    default:
    self.itemsPickerView = [self firstData];
    break;
    }

    [self.myPickerView reloadAllComponents];
    }

    #pragma mark DataSource & Delegate PickerView

    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
    }

    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return [self.itemsPickerView count];
    }

    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

    return [self.itemsPickerView objectAtIndex:row];
    }

    #pragma mark Data

    -(NSArray*) firstData {
    return @[;@Test, @Test2, @Test3];
    }

    -(NSArray*) secondData {
    return @[;@Second Test, @Second Test2, @Second Test3];
    }

    @end


  • Ok merci, je vais essayer de le réadapter et si j'ai des soucis, je reviens vers vous :)


  • Re,


     


    Bon je comprends pas trop ton IBAction et le concept de segment. Pourrais tu m'expliquer s'il te plait ? De mon côté j'ai autant de bouton que d'éléments de tableaux (donc 5).


     


    D'autre part, que deviennent ces lignes la s'il te plait ?



    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        NSString *titrePickerview = listeSuiviDossier[row];
        [suiviDossierBouton setTitle:titrePickerview forState:UIControlStateNormal];
    }

    - (void)cancelTouched:(UIBarButtonItem *)sender
    {
        [self.pickerViewDossier resignFirstResponder];
        [suiviDossierBouton setTitle:@Sélectionnez forState:UIControlStateNormal];
    }

    - (void)doneTouched:(UIBarButtonItem *)sender
    {
        [self.pickerViewDossier resignFirstResponder];
    }
  • Le Segment Control est un objet UI. C'est un composant qui dispose de plusieurs boutons. Je l'ai utilisé ici parce qu'il me simplifiait le travail mais bien sur tu dois adapter selon tes besoins. Selon le bouton sur lequel j'appuie, je déclenche un évènement (ici IBAction dont tu parles) et j'appelle une méthode précise.


     


    Enfin, pour ce qui est des lignes ci-dessus, c'est à  toi de me le dire ! Je t'ai juste montré une solution possible afin d'afficher différentes données au sein d'un seul et même PickerView.


  • AliGatorAliGator Membre, Modérateur
    Jean75 il est clairement urgent que tu t'achètes un bouquin sur la programmation en Objective-C, qui explique les bases de Cocoa, du MVC, du Target-Action, etc.


    Car ce que tu demandes ici fait partie des bases que tu apprends avec ce genre de bouquin ou tuto, et sans cela tu vas avoir du mal à  comprendre beaucoup de choses ou de réponses des forums.

    C'est un peu long et pas forcement motivant c'est sûr mais une fois que tu seras passé par cette étape crois moi beaucoup de choses deviendront plus claires y compris nos réponses et tu progresseras beaucoup plus vite !

    Bien sûr on sera toujours là  s'il y a un point du bouquin qui te bloque par exemple mais au moins une fois que tu auras les bases tu te poseras beaucoup moins de questions standard comme "C'est quoi cette IBAction" ou "comment ça marcher un delegate" et ça va bien t'éclaircir :)
  • J'ai pourtant bien compris ce qu'est un IBAction, j'ai juste pas compris ce que faisait l'action du bouton ;)


  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2014 modifié #16
    Il faut lire le bouquin ;)
Connectez-vous ou Inscrivez-vous pour répondre.