2010-08-22 1 views
0

J'utilise deux UIPickers dans une vue. le premier sélecteur a 3 composants et le second en a un. mais lorsque je sélectionne des éléments, il affiche les éléments corrects du premier sélecteur, mais renvoie toujours le premier élément du second sélecteur, quelle que soit la ligne sélectionnée. S'il vous plaît aider.Deux sélecteurs dans une vue -apphone

Voici le code que j'utilise.

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    if (pickerView == triplePicker) 
    return 3; 
    else { 
    return 1; 
    } 
} 


-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if (pickerView == triplePicker) { 
     if (component == kColorComponent) 
     return[colorList count]; 
     if (component == kClarityComponent) 
     return[clarityList count]; 
     return[shapeList count]; 
    } 
    else{ 
     return [listPickerItems count]; 
    } 
} 

-(NSString *)pickerView:(UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
      forComponent:(NSInteger)component 
{ 
    if (pickerView == triplePicker) { 
     if (component == kColorComponent) 
     return [colorList objectAtIndex:row]; 
     if (component == kClarityComponent) 
     return [clarityList objectAtIndex:row]; 
     return [shapeList objectAtIndex:row]; 
    } 
    else{ 
     return [listPickerItems objectAtIndex:row]; 
    } 
} 

en cas ButtonPressed j'ai suivant pour la deuxième sélecteur pour retourner l'élément sélectionné:

NSInteger pickrow = [listPicker selectedRowInComponent:0]; 
NSString *picked = [listPickerItems objectAtIndex:pickrow]; 

Répondre

0

Je vous conseille vraiment utiliser deux délégués distincts pour traiter les deux ramasseurs. En dehors de cela, je vais deviner que vous utilisez Interface Builder pour configurer votre vue. Si c'est le cas, vérifiez si vous avez correctement lié votre listPicker avec le propriétaire de votre fichier. Si listPicker est nul, alors selectedRowInComponent: retournera toujours null (0 pour NSInteger), donc sélectionnera toujours le premier élément de votre tableau.

EDIT: Quelques exemples de code pour les délégués distincts:

Vous devez créer une deuxième classe pour être votre délégué, comme ceci:

FirstPickerDelegate.h

#import <Foundation/Foundation.h> 

@class UntitledViewController; 

@interface FirstPickerViewDelegate : NSObject <UIPickerViewDelegate, UIPickerViewDataSource> { 
    NSArray* values; 
    IBOutlet UntitledViewController* viewController; 
} 
-(void) loadData; 

@property (nonatomic, retain) NSArray* values; 
@property (nonatomic, assign) IBOutlet UntitledViewController* viewController; 

@end 

FirstPickerViewDelegate.m

#import "FirstPickerViewDelegate.h" 


@implementation FirstPickerViewDelegate 
@synthesize values; 
@synthesize viewController; 

-(id) init 
{ 
    if (self = [super init]) 
    { 
     [self loadData]; 
    } 
    return self; 
} 

-(void) loadData 
{ 
    NSArray* array = [[NSArray alloc] initWithObjects:@"first", @"second", @"third", nil]; 
    self.values = array; 
    [array release]; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 1; 
} 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return [values count]; 
} 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    return [values objectAtIndex:row]; 
} 

-(void) dealloc 
{ 
    self.values = nil; 
    [super dealloc]; 
} 
@end 

Votre ViewController (UntitledViewController) ici, désolé le nom):

#import <UIKit/UIKit.h> 

@class FirstPickerViewDelegate; 
@interface UntitledViewController : UIViewController { 
    IBOutlet UIPickerView* firstPicker; 
    IBOutlet FirstPickerViewDelegate* firstDelegate; 
} 

@property (nonatomic, retain) IBOutlet UIPickerView* firstPicker; 
@property (nonatomic, retain) IBOutlet FirstPickerViewDelegate* firstDelegate; 

@end 

Fondamentalement, vous devez déposer une NSObject sur votre liste d'objets et changer sa classe à FirstPickerViewDelegate, puis faire des liens comme celui-ci: alt text

Je sens que j'overelaborated cette fois-ci, mais je suis dans une bonne humeur aujourd'hui afin que ce soit: P

a propos de la question principale: vérifiez que listPicker n'est pas nul au moment d'appuyer sur le bouton, si ce n'est pas, essayez d'utiliser

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

pour localiser l'erreur.

+0

Je ne sais pas comment utiliser deux délégués distincts pour deux sélecteurs. mon listPicker (second sélecteur) est correctement lié au propriétaire du fichier dans IB. – ashp

+0

Ajouté un exemple de code pour vous. J'espère que cela pourra aider. – Mayjak

+0

oups .... mon erreur. Merci pour votre aide. On dirait que je n'ai pas fait de connexion correcte du propriétaire du fichier au listPicker. Il renvoie maintenant la valeur correcte pour la ligne sélectionnée. – ashp