Несколько UIPickerView на 1 ViewController - PullRequest
1 голос
/ 07 августа 2011

Я создал 2 UIPickerView программно. Как мне убедиться, что скрыть pickerView1, когда pickerView2 собирается показать. Наоборот.

Спасибо.

Вот как я их создал.

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 1){
            [scrollView setContentOffset:CGPointMake(0, 223) animated:YES];
            CGRect pickerFrame = CGRectMake(0, 152, 0, 0);

            UIPickerView *pickerView1 = [[UIPickerView alloc] initWithFrame:pickerFrame];
            pickerView1.showsSelectionIndicator = YES;
            pickerView1.dataSource = self;
            pickerView1.delegate = self;
            [pickerView1 setTag:1];
            [self.view addSubview:pickerView1];
            [pickerView1 release];
            [tableView deselectRowAtIndexPath:indexPath animated:YES];

        }
        else if (indexPath.row == 2){
            [scrollView setContentOffset:CGPointMake(0, 273) animated:YES];
            CGRect pickerFrame = CGRectMake(0, 152, 0, 0);

            UIPickerView *pickerView2 = [[UIPickerView alloc] initWithFrame:pickerFrame];
            pickerView2.showsSelectionIndicator = YES;
            pickerView2.dataSource = self;
            pickerView2.delegate = self;
            [pickerView2 setTag:2];
            [self.view addSubview:pickerView2];
            [pickerView2 release];
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
        }
    }

Ответы [ 3 ]

2 голосов
/ 07 августа 2011

Во время настройки:

pickerView1.hidden = NO;
pickerView2.hidden = YES;

При переключении (это будет работать в обоих направлениях):

pickerView1.hidden = !pickerView1.hidden;
pickerView2.hidden = !pickerView1.hidden;

Приветствия,
Саша

1 голос
/ 07 августа 2011

В вашем viewDidLoad:

[pickerView1 setAlpha:1.0];
[pickerView2 setAlpha:0.0];

Там, где pickerView1 виден, тогда как pickerView2 нет.

И везде, где вы хотите отобразить pickerView2, скрывая pickerView1 - просто измените вышеприведенное.

[pickerView1 setAlpha:0.0];
[pickerView2 setAlpha:1.0];

Существуют и другие способы сделать это, но я предпочитаю это делать.

ОБНОВЛЕНИЕ:

Вот как вы могли бы реализоватьиспользуя ваш код:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 1){
        [scrollView setContentOffset:CGPointMake(0, 223) animated:YES];
        CGRect pickerFrame = CGRectMake(0, 152, 0, 0);

        if (pickerView1 == nil) { //<--- You don't need to keep calling alloc and init. This if statement only calls if you have not already declared pickerView1.
            UIPickerView *pickerView1 = [[UIPickerView alloc] initWithFrame:pickerFrame];
            pickerView1.showsSelectionIndicator = YES;
            pickerView1.dataSource = self;
            pickerView1.delegate = self;
            [pickerView1 setTag:1];
            [self.view addSubview:pickerView1];
        }

        [pickerView1 setAlpha:1.0]; //<--- New Code
        if (pickerView2 != nil) { //<-- Checking if pickerView2 is declared yet, if not then it is already invisible. ;)
            [pickerView2 setAlpha:0.0];
        }

        //removed release call - add to dealloc method
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

    }
    else if (indexPath.row == 2){
        [scrollView setContentOffset:CGPointMake(0, 273) animated:YES];
        CGRect pickerFrame = CGRectMake(0, 152, 0, 0);

        if (pickerView2 == nil) { //<-- again, no need to always alloc and init
            UIPickerView *pickerView2 = [[UIPickerView alloc] initWithFrame:pickerFrame];
            pickerView2.showsSelectionIndicator = YES;
            pickerView2.dataSource = self;
            pickerView2.delegate = self;
            [pickerView2 setTag:2];
            [self.view addSubview:pickerView2];
        }

        [pickerView2 setAlpha:1.0]; //<--- New Code
        if (pickerView1 != nil) { //<-- Checking if pickerView1 is declared yet, if not then it is already invisible. ;)
            [pickerView1 setAlpha:0.0];
        }
        //add release call to dealloc method
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

ОБНОВЛЕНИЕ 2:

Попробуйте это:

В файле заголовка (.h) добавьте это:

    @interface <name>ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
        UIPickerView *pickerView1;
        UIPickerView *pickerView2;
    }
    @property (nonatomic, retain) UIPickerView *pickerView1;
    @property (nonatomic, retain) UIPickerView *pickerView2;
    @end

Вы должны объявить здесь свои pickerViews, чтобы мой предыдущий код работал.Также обратите внимание на протоколы <UIPickerViewDelegate, UIPickerViewDataSource>.

Вернувшись в файл реализации (.m), не забудьте синтезировать:

@synthesize pickerView1;
@synthesize pickerView2;

И в - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath заменить:

UIPickerView *pickerView1 = [[UIPickerView alloc] initWithFrame:pickerFrame];

с

pickerView1 = [[UIPickerView alloc] initWithFrame:pickerFrame];

И замените:

UIPickerView *pickerView2 = [[UIPickerView alloc] initWithFrame:pickerFrame];

на:

pickerView2 = [[UIPickerView alloc] initWithFrame:pickerFrame];

Просто не забудьте освободить их в методе dealloc:

    - (void)dealloc {
        [pickerView1 release];
        [pickerView2 release];
        [super dealloc];
    }

Ваша необъявленная проблема должна быть решена сейчас.

1 голос
/ 07 августа 2011
[self.view addSubview:pickerView1];

[pickerView2 removeFromSuperview];

//or

[pickerView2 setAlpha:0.0];
...