2013-03-11 103 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 2013-03-11 07:28:01

+0

是的,我迷上了所有的IB部分的情节串连图板就像YouTube视频一样。 – theJPE 2013-03-11 07:33:31

+0

然后尝试@ Durgaprasad的答案,一旦它可以帮助 – channi 2013-03-11 07:34:32

回答

18

您需要设置选择器视图的dataSource和填充阵列后调用reloadAllComponents

self.personInfoPicker.delegate = self; 
self.personInfoPicker.dataSource = self; 
[self.personInfoPicker reloadAllComponents]; 
+0

您应该设置'delegate'和'dataSource'第一,然后调用'reloadAllComponents'。所以你得到的代码是正确的,而不是顺序。 – 2013-03-11 07:45:34

+0

我应该如何设置数据源:personInfoPicker.dataSource = self; – theJPE 2013-03-11 07:48:54

+0

你为什么不试试?我已经用你需要的确切代码更新了我的答案。 – 2013-03-11 07:49:55

2

尝试初始化所有三个arrarys在init()方法。

1

你的代码没问题。只需要在方法中改变“pickerView”名称的对象。

更换

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

通过,

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

而且,

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

通过,

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

由于personInfoPickerPickerView的对象,因此您已经在.h文件中使用过,因此在为pickerView加载数据时会发生冲突。

希望,它会帮助你。

谢谢。

1

我觉得你的代码是完全正确的设置datasourcedelegate很好,但你忘了去年viewdidload重装pickerview是解决你的问题的重新加载uipickerview所以

0

我想你我以前不分配使用的数组作为选择器如的数据源

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

我复制了你的初始代码,现在发现你的bug了。还有就是

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

在委托方法的名称拼写错误

相反,它必须是

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

如果你写pickerview它会声明在类的新方法,这将永远不会被调用。如此简单,但无论如何是烦人:-)

+0

这是完全相同的代码。 – CyberMew 2016-01-28 10:39:46