it-swarm.com.ru

UIPickerView в UITableView

Прежде всего: я знаю, что некоторые люди уже публиковали подобные темы, но никто не дал четкого ответа на все эти темы.

У меня есть настройки-UITableView в моем приложении. Теперь я хочу добавить TableViewCell, где я могу выбирать между некоторыми числами с UIPickerView.

В методе tableView didSelectRowAtIndexPath я создал оператор if для правой ячейки

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

    if (indexPath.row == 1){

    }
}

Как я могу добавить UIPickerView для этой ячейки? Он должен скользить снизу вверх, и было бы хорошо, если есть что-то вроде кнопки «готово».

15
Mike_NotGuilty

Это также основано на вашем другом вопросе, поэтому я включаю и эти функциональные возможности здесь (т.е. переключатель).

В вашем YourTableViewController.h

задавать: 

@interface YourTableViewViewController : UITableViewController <UIPickerViewDataSource, UIPickerViewDelegate>

В вашем YourTableViewController.m

Вставьте этот код:

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

Приложение:

Кроме того, в вашей раскадровке измените separator для YourTableView на None (выглядит лучше в вашем случае здесь).

Разделитель табличного представления:

в viewDidLoad, добавьте:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

И в bringUpPickerViewWithRow

после:

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

добавлять:

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

И наконец, в hidePickerView добавьте:

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

Вы видели пример программы, выпущенной с iOS 7, под названием DateCell ? Он использует UIDatePicker, но я нашел довольно простым, чтобы адаптировать его к обычному UIPickerView. 

Он делает именно то, что вы описываете: редактируйте UITableViewCell с помощью средства выбора, которое открывается непосредственно под строкой, которую вы редактируете.

18
DaiMaoTsai
  1. Создайте пользовательский ViewController, включающий кнопки UIPickerView и Done
  2. Добавьте это как подпредставление на вашем табличном представлении. (Поместите его снизу так , Что он не виден). 
  3. Как только пользователь щелкнет по соответствующей ячейке, вы Сможете анимировать вид сборщика снизу. 
  4. Как только пользователь выберет элемент Animate и поместит его вниз.

Я сделал выше шаги для той же цели. Если вы хотите, я могу отправить пользовательский контроллер, который включает в себя UIPickerView и кнопку Готово. 

0
HDG