2013-03-11 3 views
5

Ich habe ein paar Youtube Tutorials sowie Ratschläge hier, aber ich kann nicht scheinen, meine UIPickerView zu bekommen, um seine Daten anzuzeigen. Ich bevölkere den Picker mit drei Arrays und dachte, ich hätte den Code korrekt implementiert, aber offensichtlich stimmt etwas nicht. Der Picker zeigt die Anzahl der Elemente korrekt an, das Problem ist, dass sie alle als '?' Angezeigt werden.UIPickerView zeigt keine Daten an

Ich habe versucht, den delegierten Picker selbst zu setzen, aber das hat auch nicht funktioniert. Danke im Voraus.

Hier ist meine .h-Datei:

@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 

Hier ist meine .m-Datei:

@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

hast du den Delegaten und die Datenquelle deines UIPickerViews auf den Dateibesitzer gesetzt? – channi

+0

Ja, ich habe alle IB-Teile im Storyboard angeschlossen, genau wie die Youtube-Videos. – theJPE

+0

dann versuchen @ Durgaprasad die Antwort, sobald es helfen kann – channi

Antwort

18

Sie müssen die Ansicht dataSource der Auswahlliste festlegen und reloadAllComponents aufrufen, nachdem Sie Arrays gefüllt haben.

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

Sie sollten zuerst 'delegate' und' dataSource' setzen, dann '' reloadAllComponents' aufrufen. Du hast also den richtigen Code, einfach nicht die Bestellung. –

+0

Sollte ich die Datenquelle mit festlegen: personInfoPicker.dataSource = self; – theJPE

+0

Warum versuchst du es nicht einfach? Ich habe meine Antwort mit dem genauen Code aktualisiert, den Sie benötigen. –

2

versuchen, alle drei arrarys in init-Methode initialisiert.

1

Der Code ist in Ordnung. Sie müssen nur das Objekt "pickerView" in der Methode ändern.

ersetzen

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

By,

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

Und

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

By,

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

Da personInfoPicker das Objekt PickerView ist, das Sie bereits in der .h-Datei verwendet haben, tritt beim Laden von Daten für pickerView ein Konflikt auf.

Hoffentlich hilft es Ihnen.

Danke.

1

Ich denke, Ihr Code absolut korrekt ist und Sie setzen datasource und delegate als gut, aber Sie vergessen uipickerview so in letzter viewdidload reload pickerview neu zu laden, die Ihr Problem lösen

0

Ich glaube, Sie das Array zugeordnet did't verwendet als Datenquelle von Picker zB

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

können Sie versuchen, dies unter dem Code.

`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

Ich habe Ihren ursprünglichen Code kopiert und jetzt Ihren Fehler gefunden.Es ist ein Tippfehler in dem Delegatmethode Namen

statt

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

es

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

sein muss Wenn Sie picker schreiben es wird eine neue Methode in der Klasse deklariert, die nie aufgerufen werden . So einfach, aber trotzdem nervig :-)

+0

Es ist der exakt gleiche Code. – CyberMew