web-dev-qa-db-fra.com

Comment configurer un UIPickerView?

Je configure un UIPickerView pour avoir des choix comme choix a, choix b, choix c et ainsi de suite. J'ai essayé d'interpréter l'exemple de code de Apple mais cela semble très difficile à comprendre pour un débutant comme moi. J'aimerais également que les choix de la vue du sélecteur me conduisent à une autre page si cela est possible.

14
Nikita Jerschow

Il est évident pour tout débutant que c'est un peu fastidieux de comprendre ces choses la première fois.

Quoi qu'il en soit, savez-vous comment utiliser UITableViews? Savez-vous comment utiliser UITableViewDelegate et UITableViewDataSource? Si votre réponse est oui, imaginez simplement que UIPickerViews sont comme UITableViews (mais rappelez-vous qu'ils ne sont pas UITableViewControllers).

Disons que j'ai un UIPickerView:

UIPickerView *objPickerView = [UIPickerView new];  // You need to set frame or other properties and add to your view...you can either use XIB code...

1) Vous devez d'abord affecter les delegate et dataSource aux UIPickerView via IB ou code. Cela dépend de votre implémentation (cette étape ressemble donc beaucoup à un UITableView, n'est-ce pas?)

Comme ça:

objPickerView.delegate = self; // Also, can be done from IB, if you're using
objPickerView.dataSource = self;// Also, can be done from IB, if you're using

2) Ensuite, vous devez définir le nombre de sections, comme ceci:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
     return 1;  // Or return whatever as you intend
}

2) Ensuite, vous devez définir le nombre de lignes dont vous avez besoin:

- (NSInteger)pickerView:(UIPickerView *)thePickerView 
numberOfRowsInComponent:(NSInteger)component {
     return 3;//Or, return as suitable for you...normally we use array for dynamic
}

3) Ensuite, définissez le titre de la ligne (Et si vous avez plusieurs sections, alors le titre de chaque section):

- (NSString *)pickerView:(UIPickerView *)thePickerView 
             titleForRow:(NSInteger)row forComponent:(NSInteger)component {
     return [NSString stringWithFormat:@"Choice-%d",row];//Or, your suitable title; like Choice-a, etc.
}

4) Ensuite, vous devez obtenir l'événement lorsque quelqu'un clique sur un élément (lorsque vous souhaitez naviguer vers un autre contrôleur/écran):

- (void)pickerView:(UIPickerView *)thePickerView 
      didSelectRow:(NSInteger)row 
       inComponent:(NSInteger)component {

//Here, like the table view you can get the each section of each row if you've multiple sections
     NSLog(@"Selected Color: %@. Index of selected color: %i", 
     [arrayColors objectAtIndex:row], row);

     //Now, if you want to navigate then;
     // Say, OtherViewController is the controller, where you want to navigate:
     OtherViewController *objOtherViewController = [OtherViewController new];
     [self.navigationController pushViewController:objOtherViewController animated:YES];

}

C'est toute l'implémentation dont vous avez besoin.

46
Mohit_Jaiswal

Je vais expliquer brièvement comment y parvenir par programme

- (void)viewDidLoad {
    [super viewDidLoad];

    UIPickerView * picker = [UIPickerView new];
    picker.delegate = self;
    picker.dataSource = self;
    picker.showsSelectionIndicator = YES;
    [self.view addSubview:picker];
}

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return 3;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString * title = nil;
    switch(row) {
            case 0:
                title = @"a";
                break;
            case 1:
                title = @"b";
                break;
            case 2:
                title = @"c";
                break;
    }
    return title;
}

Fondamentalement, dans le viewDidLoad, nous créons et ajoutons un UIPickerView à la vue, lui indiquant que notre contrôleur sert à la fois de delegate et dataSource (vous pouvez faire cela dans Interface Builder aussi)

Ensuite, nous implémentons deux méthodes de source de données afin de déterminer le nombre de composants et le nombre de lignes par composant du pickerView, respectivement numberOfComponentsinPickerView: et pickerView:numberOfRowsInComponent:

Enfin, nous implémentons la méthode déléguée pickerView:titleForRow:forComponent: qui renvoie le contenu de chaque ligne.

Si vous souhaitez personnaliser le comportement lorsqu'une ligne a été sélectionnée, vous pouvez implémenter la méthode déléguée pickerView:didSelectRow:inComponent: qui - comme son nom l'indique - est appelé chaque fois qu'une ligne est sélectionnée.

9

Un UIPickerView utilise un partenaire similaire à celui utilisé pour un UITableView. DataSource et Delegate protocole.

Les méthodes DataSource sont utilisées pour indiquer au sélecteur combien de "colonnes" et combien de "lignes" il y a dans votre sélecteur.
Alors que les méthodes Delegate sont pour le reste, la hauteur des lignes, la largeur des colonnes, les vues ou le titre à afficher et un rappel lorsque le sélecteur a été déplacé.
IPickerView

4
Vincent Bernier