Несколько UIPickerView - PullRequest
       9

Несколько UIPickerView

3 голосов
/ 22 февраля 2012

У меня есть несколько UIPickerViews в моем viewController.

И это один из них необходимо настроить, так как он отображает 2 UILabel в 1 строке выбора.

И я использую эти методы делегата:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row 
forComponent:(NSInteger)component {
    // this method is use for normal pickers, and I would judge whether the picker that calling
    // this method is a normal one or the special one by pickerView.
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view {
    // and this one is specially for the special picker, I would also judge the pickerView is  
    //normal or special, if pickerView is normal, return nil, else I return a UIView with 
    //2 UIlabels.
}

Но теперь, после моей отладки, я обнаружил, что, если я реализую 2 метода вместе, второй всегда вызывается, а первый, кажется, никогда не вызывается,

и онв результате мой специальный сборщик отображает правильные данные, но другие не имеют ничего.

Как я могу это сделать?

если я передам данные всех сборщиков во втором методе, станет ли повторное использование ViewViewпроблема, поскольку вид повторного использования специального средства выбора не совпадает с форматом другого средства выбора?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Я бы добавил к вышеуказанному ответу 'govi'; Свойство 'tag' (для этого вы должны назначить разные значения 'tag' для каждого представления UIPicker, то есть 1,2,3 ...) также может использоваться для идентификации нескольких UIPikeView; например.,

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
if (pickerView.tag ==0) {

}
else if (pickerView.tag ==1) {
    UILabel *lbl = [[UILabel alloc] init];
    lbl.text = [self pickerView:pickerView titleForRow:row forComponent:component];
    //do some more styling like setting up the font as bold
    //adding some padding to the text and some shiny things
    return lbl;
}

}

Более того, вы можете использовать любой из этих

 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if (pickerView.tag ==0) {    }
else if (pickerView.tag ==1) { } }

Это особенно полезно, когда вы хотите, чтобы Picker просто отображал какое-то значение. тогда как вышеуказанный используется, если вы хотите добавить некоторые настройки к отображаемой метке (то есть ширина, высота, шрифт ...) ..

1 голос
/ 22 февраля 2012

Использование другого делегата не так просто.Создайте отдельный класс,

@interface MyCustomDelegate : NSObject <UIPickerViewDelegate> 

и реализуйте методы делегата, в этом случае

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row 
forComponent:(NSInteger)component {
    // this method is use for normal pickers, and I would judge whether the picker that calling
    // this method is a normal one or the special one by pickerView.
}

Как только вы сделаете это, создайте экземпляр этого класса и установите его как делегат как..

pickerView.delegate = [[MyCustomDelegate alloc] initWithData:data] autorelease];

где данные могут быть данными, которые вы, возможно, захотите включить в методы делегата для заголовков.

Вы можете использовать один и тот же экземпляр делегата для всех сборщиков.или может создавать отдельные экземпляры.Много зависит от того, какие данные у вас есть.Если они все не связаны друг с другом, было бы неплохо использовать отдельные экземпляры, в противном случае вы могли бы продолжить только один.

Ну, вот и все.


Что касаетсяво-вторых, вы будете делать что-то вроде этого

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    if (pickerView==specialPickerView) {

    }
    else {
        UILabel *lbl = [[UILabel alloc] init];
        lbl.text = [self pickerView:pickerView titleForRow:row forComponent:component];
        //do some more styling like setting up the font as bold
        //adding some padding to the text and some shiny things
        return lbl;
    }
}

Конечно, вы будете делать это в вашем существующем классе.

...