2013-03-11 4 views
5

Я следил за учебными пособиями по YouTube, а также советами здесь, но я не могу заставить свой UIPickerView отображать его данные. Я заполняю сборщик, используя три массива, и я думал, что правильно реализовал код, но, очевидно, что-то не так. Сборщик отображает количество элементов правильно, проблема в том, что все они отображаются как «?»UIPickerView не отображает данные

Я пытался настроить делегата сборщика на себя, но это тоже не сработало. Заранее спасибо.

Вот мой .h файл:

@interface BACcalcViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate> 
@property(strong, nonatomic) IBOutlet UIPickerView *personInfoPicker; 
@property(strong, nonatomic) NSArray *heightsArray; 
@property(strong, nonatomic) NSArray *weightsArray; 
@property(strong, nonatomic) NSArray *timeArray; 
@end 

Вот мой файл .m:

@interface BACcalcViewController() <UIPickerViewDataSource, UIPickerViewDelegate> 

@end 

@implementation BACcalcViewController 


@synthesize personInfoPicker, heightsArray, weightsArray, timeArray; 
- (void)viewDidLoad 
{ 

[super viewDidLoad]; 

heightsArray = [NSArray arrayWithObjects: 
         @"5ft 0in", 
         @"5ft 1in", 
         @"5ft 2in", 
         @"5ft 3in", 
         @"5ft 4in", 
         @"5ft 5in", 
         @"5ft 6in", 
         @"5ft 7in", 
         @"5ft 8in", 
         @"5ft 9in", 
         @"5ft 10in", 
         @"5ft 11in", 
         @"6ft 1in", 
         @"6ft 2in", 
         @"6ft 3in", 
         @"6ft 4in", 
         @"6ft 5in", 
         @"6ft 6in", 
         @"6ft 7in", 
         @"6ft 8in", 
         nil]; 

weightsArray = [NSArray arrayWithObjects: 
        @"100", 
        @"110", 
        @"120", 
        @"130", 
        @"140", 
        @"150", 
        @"160", 
        @"170", 
        @"180", 
        @"190", 
        @"200", 
        @"210", 
        @"220", 
        @"230", 
        @"240", 
        @"250", 
        @"260", 
        nil]; 


timeArray = [NSArray arrayWithObjects: 
      @"1", 
      @"2", 
      @"3", 
      @"4", 
      @"5", 
      @"6", 
      nil]; 
} 



- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)personInfoPicker 
{ 
    return 3; 
} 


- (NSInteger)pickerView:(UIPickerView *)personInfoPicker numberOfRowsInComponent: (NSInteger)component 
{ 
    if (component == 0) 
     return [heightsArray count]; 
    else if (component == 1) 
     return [weightsArray count]; 
    else 
     return [timeArray count]; 
} 

- (NSString *)pickerview:(UIPickerView *)personInfoPicker titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{  
    if (component == 0) 
     return [heightsArray objectAtIndex:row]; 
    else if (component == 1) 
     return [weightsArray objectAtIndex:row]; 
    else 
     return [timeArray objectAtIndex:row]; 
} 
@end 
+1

Вы установили делегат и источник данных вашего UIPickerView файловому владельцу? – channi

+0

Да, я подключил все части IB в раскадровке, как это делали видеоролики youtube. – theJPE

+0

затем попробуйте ответить @ Durgaprasad, как только он сможет помочь – channi

ответ

18

Вам необходимо установить вид выборащика dataSource и вызвать reloadAllComponents после заполнения массивов.

+0

Сначала вы должны установить 'delegate' и' dataSource', а затем вызвать 'reloadAllComponents'. Таким образом, вы получили код правильно, а не порядок. –

+0

Должен ли я установить источник данных с помощью: personInfoPicker.dataSource = self; – theJPE

+0

Почему бы вам просто не попробовать? Я обновил свой ответ с точным кодом, который вам нужен. –

2

попробовать инициализацию все три arrarys в методе инициализации.

1

Ваш код в порядке. Просто нужно изменить в объекте имя «pickerView» в методе.

Заменить

- (NSInteger)pickerView:(UIPickerView *)personInfoPicker numberOfRowsInComponent: (NSInteger)component 

By,

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent: (NSInteger)component 

И

- (NSInteger)pickerView:(UIPickerView *)personInfoPicker numberOfRowsInComponent: (NSInteger)component 

К,

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent: (NSInteger)component 

Потому что personInfoPicker является объектом PickerView, который вы уже использовали в формате .h, поэтому он будет конфликтовать при загрузке данных для pickerView.

Надеюсь, это поможет вам.

Спасибо.

1

Я думаю, что ваш код является абсолютно правильным и установить datasource и delegate как хорошо, но вы забыли перезагрузить uipickerview так и в последнем из viewdidload перезагрузки pickerview, что решить проблему

0

Я думаю, что вы did't выделяются массив, используемый как источник данных сборщика, например

NSMutableArray *_month_ary=[[NSMutableArray alloc]initWithObjects:@"01",@"02",@"03",@"04",@"05",@"06",@"07",@"08",@"09",@"10",@"11",@"12", nil]; 
2

Вы можете попробовать этот ниже код.

`NSMutableArray *_month_ary=[[NSMutableArray alloc]initWithObjects:@"01",@"02",@"03",@"04",@"05",@"06",@"07",@"08",@"09",@"10",@"11",@"12", nil]; 
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; 
{ 
    return 1; 
} 

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 


    if ([pickerView isEqual:_month_picker_view]) { 
     return [_month_ary count]; 
    } 
    return 0; 
} 
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 


    if ([pickerView isEqual:_month_picker_view]) 
    { 
     return [_month_ary objectAtIndex:row]; 
    } 
    return nil; 
} 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 


    if ([pickerView isEqual:_month_picker_view]) { 
     _Pay_Month_txt.text=[_month_ary objectAtIndex:row]; 
     deal_cridit_card_month_str = [_month_ary objectAtIndex:row]; 
    } 
}` 
1

Я скопировал ваш первоначальный код и нашел вашу ошибку сейчас.Существует опечатка в имени метода делегата

вместо

- (NSString *)pickerview:(UIPickerView *)personInfoPicker titleForRow:(NSInteger)row forComponent:(NSInteger)component 

он должен быть

- (NSString *)pickerView:(UIPickerView *)personInfoPicker titleForRow:(NSInteger)row forComponent:(NSInteger)component 

Если вы пишете pickerview он объявит новый метод в своем классе, который никогда не будет называться , Так просто, но все равно :-)

+0

Это тот же самый код. – CyberMew

Смежные вопросы