web-dev-qa-db-fra.com

UIPickerView dans UITableView

Tout d’abord: je sais que certaines personnes ont déjà posté des sujets de ce type, mais personne n’a répondu clairement à tous ces sujets.

J'ai un paramètres-UITableView dans mon application. Maintenant, je veux ajouter un TableViewCell où je peux choisir entre quelques chiffres avec un UIPickerView.

Dans la méthode tableView didSelectRowAtIndexPath, j'ai créé l'instruction if pour la bonne cellule

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if (indexPath.row == 1){

    }
}

Comment puis-je ajouter un UIPickerView pour cette cellule? Il devrait glisser du bas vers le haut et ce serait bien s'il y a quelque chose comme un bouton "fait".

15
Mike_NotGuilty

Ceci est également basé sur votre autre question, donc j'inclus ces fonctionnalités ici aussi (c'est-à-dire le commutateur).

Dans votre YourTableViewController.h

ensemble: 

@interface YourTableViewViewController : UITableViewController <UIPickerViewDataSource, UIPickerViewDelegate>

Dans votre YourTableViewController.m

Collez ce code:

@interface YourTableViewViewController ()
@property NSInteger toggle;
@property (strong, nonatomic) UIPickerView *pickerView;
@end

@implementation YourTableViewViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.toggle = 0;
    self.pickerView = [[UIPickerView alloc] initWithFrame:(CGRect){{0, 0}, 320, 480}];
    self.pickerView.delegate = self;
    self.pickerView.dataSource = self;
    self.pickerView.center = (CGPoint){160, 640};
    self.pickerView.hidden = YES;
    [self.view addSubview:self.pickerView];
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 2;    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    if(indexPath.row == 0)
    {
        [cell.contentView addSubview:self.mySwitch];
    }
    if(indexPath.row == 1)
    {
        cell.textLabel.textColor = [UIColor darkGrayColor];
        if(self.toggle == 0)
        {
            cell.textLabel.text = @"Choose a number";
        }
        else
        {
            cell.textLabel.text = @"Cancel";
        }
    }
    // Configure the cell...

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 1)
    {
        if(self.toggle == 0)
        {
            self.toggle = 1;
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:YES];
            [self bringUpPickerViewWithRow:indexPath];
        }
        else
        {
            self.toggle = 0;
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:YES];
            [self hidePickerView];
        }
    }
}

- (void)bringUpPickerViewWithRow:(NSIndexPath*)indexPath
{
    UITableViewCell *currentCellSelected = [self.tableView cellForRowAtIndexPath:indexPath];
    [UIView animateWithDuration:1.0f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^
                     {
                         self.pickerView.hidden = NO;
                         self.pickerView.center = (CGPoint){currentCellSelected.frame.size.width/2, self.tableView.frame.Origin.y + currentCellSelected.frame.size.height*4};
                     }
                     completion:nil];
}

- (void)hidePickerView
{
    [UIView animateWithDuration:1.0f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^
     {
         self.pickerView.center = (CGPoint){160, 800};
     }
                     completion:^(BOOL finished)
     {
         self.pickerView.hidden = YES;
     }];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    self.toggle = 0;
    [self.tableView reloadData];
    [self hidePickerView];
    NSLog(@"row selected:%ld", (long)row);
}

- (NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [NSString stringWithFormat:@"%d", row+1];
}

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

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

@end

Tested.

Addenda:

De plus, dans votre storyboard , remplacez la valeur separator par YourTableView par None ((votre apparence sera meilleure ici).

Séparateur de vue de table:

dans viewDidLoad, ajouter:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

Et dans bringUpPickerViewWithRow

après:

UITableViewCell *currentCellSelected = [self.tableView cellForRowAtIndexPath:indexPath];

ajouter:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.tableView setNeedsDisplay];

Et enfin, dans hidePickerView, ajoutez:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
[self.tableView setNeedsDisplay];
16
Unheilig

Avez-vous vu l'exemple de programme publié avec iOS 7 appelé DateCell ? Il utilise un UIDatePicker, mais j’ai trouvé assez simple de l’adapter à un UIPickerView normal. 

Il fait exactement ce que vous décrivez: éditez une UITableViewCell avec un sélecteur qui s'ouvre directement sous la ligne que vous éditez.

18
DaiMaoTsai
  1. Créez un ViewController personnalisé comprenant les boutons UIPickerView et Done
  2. Ajoutez-le comme sous-vue sur votre tableview. (Placez-le en bas de manière à ce qu'il ne soit pas visible). 
  3. Lorsque l'utilisateur clique sur la cellule appropriée, vous pouvez animer la vue du sélecteur à partir du bas. 
  4. Une fois que l'utilisateur sélectionne un élément, animez-le et positionnez-le en bas.

J'ai fait les étapes ci-dessus dans le même but. Si vous le souhaitez, je peux envoyer un contrôleur personnalisé incluant UIPickerView et le bouton Terminé. 

0
HDG