Компоненты UIpickerview в разных UIViews, как получить доступ? - PullRequest
0 голосов
/ 16 июня 2011

Как получить доступ (получить выбор пользователя) из компонентов UIpickerview в разных UIViews (НЕ используя конструктор интерфейса)?

Спасибо.

Вот мой код:

UIView *myView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 100, 100, 100)];
UIView *myView2 = [[UIView alloc] initWithFrame:CGRectMake(20, 250, 100, 100)];

[myView1 setBackgroundColor:[UIColor blueColor]];
[myView2 setBackgroundColor:[UIColor redColor]];

[self.view addSubview:myView1];
[self.view addSubview:myView2];

UIPickerView *pickerView1 = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)];
pickerView1.delegate = self;
pickerView1.showsSelectionIndicator = YES;
[myView1 addSubview:pickerView1];

UIPickerView *pickerView2 = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)];
pickerView2.delegate = self;
pickerView2.showsSelectionIndicator = YES;
[myView2 addSubview:pickerView2];

У меня есть этот обратный вызов, но как только я помещаю pickerView в несколько UIViews, происходит сбой:

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSLog(@"Selected Color: %@. Index of selected color: %i", [arrayColors objectAtIndex:row], row); 
} 

Это проблема (но не знаю, как обойти):

[self.view addSubview:pickerView1]; //<-- this works (able to get a response)
//[myView1 addSubview:pickerView1];  //<-- this fails 

Не знаю, почему я должен иметь его на главном экране ??

Ответы [ 4 ]

1 голос
/ 16 июня 2011

Так как оба представления имеют один и тот же делегат, вам необходимо различать их в методах делегатов. Один из способов сделать это - использовать свойство tag.

Установите свойство тега для каждого из представлений вашего выбора. Затем в методе делегата UIPickerView pickerView:didSelectRow:inComponent: запросите тег и ответьте соответственно.

#define kVIEW1_PICKERVIEW_TAG 123
#define kVIEW2_PICKERVIEW_TAG 456

UIView *myView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 100, 100, 100)];
UIView *myView2 = [[UIView alloc] initWithFrame:CGRectMake(20, 250, 100, 100)];

[myView1 setBackgroundColor:[UIColor blueColor]];
[myView2 setBackgroundColor:[UIColor redColor]];

[self.view addSubview:myView1];
[self.view addSubview:myView2];

UIPickerView *pickerView1 = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)];
pickerView1.delegate = self;
pickerView1.tag = kVIEW1_PICKERVIEW_TAG;
pickerView1.showsSelectionIndicator = YES;
[myView1 addSubview:pickerView1];

UIPickerView *pickerView2 = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)];
pickerView2.delegate = self;
pickerView2.tag = kVIEW2_PICKERVIEW_TAG;
pickerView2.showsSelectionIndicator = YES;
[myView2 addSubview:pickerView2];

-

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

switch( pickerView.tag ) {
    case kVIEW1_PICKERVIEW_TAG:
       /* code */
        break;
    case kVIEW2_PICKERVIEW_TAG:
        /* code */
        break;
    default:
        break;
    }

}
0 голосов
/ 16 июня 2011
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 

 }
0 голосов
/ 16 июня 2011

Вы можете использовать метод делегата pickerView: didSelectRow: inComponent: в протоколе UIPickerViewDelegate и использовать теги для идентификации средства выбора

назначить теги:

pickerView1.tag = 1;
pickerView2.tag = 2;

В вашем методе делегата:

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

if(thePickerView.tag == 1 ){
//do this
}

else if (thePickerView.tag == 2){
//do this 
}

}
0 голосов
/ 16 июня 2011

@ jdl вам нужно прочитать методы delgate в UIPickerView.А также делегировать протоколы.

...