2009-10-26 7 views
1

Existe-t-il un moyen de définir une valeur par défaut pour un sélecteur? Je sauvegarde la dernière ligne sélectionnée de tous les sélecteurs et je veux que les sélecteurs puissent charger ces lignes sauvegardées au démarrage. À partir de maintenant, j'ai trouvé ce code:Valeur par défaut du sélecteur iphone

[settingsPagePicker selectRow:3 inComponent:0 animated:YES]; 

Il fonctionne, mais uniquement lorsque l'utilisateur tape le sélecteur. J'en ai besoin pour travailler quand l'application est chargée pour la première fois. Si je mets ce code à viewDidLoad, l'application va planter. Quelqu'un sait où le bon endroit pour mettre cela dans mon code pour le faire fonctionner?

Nous vous remercions de votre temps!

Répondre

6

Avez-vous vérifié votre source de données pour le settingsPagePicker avant d'appeler -selectRow: inComponent: animation pour vous assurer qu'il existe des données disponibles à cet index (3 dans votre exemple de code)?

Comment chargez-vous vos données pour votre source de données? Vous pouvez d'abord initialiser votre source de données dans viewDidLoad, puis appeler selectRow dès que vous savez que des données sont disponibles.

MISE À JOUR: Voici ce que votre code devrait ressembler ou quelque chose comme ça:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    pickerDataSource = [[NSMutableArray alloc] init]; 
    [pickerDataSource addObject:@"Item 01"]; 
    [pickerDataSource addObject:@"Item 02"]; 
    [pickerDataSource addObject:@"Item 03"]; 
    [pickerDataSource addObject:@"Item 04"]; 

    // Might want to move this to -viewWillAppear:animated 
    [settingsPagePicker selectRow:3 inComponent:0 animated:YES]; 
} 

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    if (pickerView == settingsPagePicker) 
    { 
     return [pickerDataSource objectAtIndex:row]; 
    } 
    return @""; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if (pickerView == settingsPagePicker) 
    { 
     return [pickerDataSource count]; 
    } 
    return 0; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView 
{ 
    return 1; 
} 
+0

je reçois: app Terminating en raison d'exception uncaught 'NSRangeException', raison: '*** - [NSCFArray objectAtIndex:]: index (0) au-delà des limites (0)' je dois initialiser Ma source de données d'abord, mais comment puis-je initialiser la source de données sans surfer en utilisant le sélecteur? – Jeff

+0

Il semble que votre source de données soit un NSArray. Votre erreur signifie que vous essayez d'accéder à une ligne de la source de données qui n'existe pas (encore). Comment attribuez-vous actuellement NSArray? Dans quel cas? Il ne devrait pas être nécessaire d'appuyer sur le sélecteur pour initialiser un NSArray. Il suffit de l'initialiser dans -viewDidLoad. Ensuite, lorsque -pickerView: titleForRow: forComponent devrait retourner n'importe quel objet à cet index (ligne) dans votre NSArray. –

+0

Mon NSArray est en cours d'initialisation dans viewDidLoad. Si je mets un point d'arrêt sur le tableau, l'application s'arrêtera là. Je pense que je ne suis pas à quelque chose .. – Jeff

2

Voici quelques méthodes de ma classe.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    currentNumbersOfComponents = 1; 
    //[picker selectRow:2 inComponent:0 animated:NO]; 
} 
- (void) viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    [picker selectRow:2 inComponent:0 animated:YES]; 
} 

#pragma mark picker view data source methods 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 
    return currentNumbersOfComponents; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 
    return 5; 
} 

picker.dataSource est auto

+0

Je n'ai pas une méthode pour viewDidAppear donc je fait une et j'ai placé le code là-bas et les application se bloque droit à settingsPagePicke. - (vide) viewDidAppear: (BOOL) animé { [settingsPagePicker selectRow: 3 inComponent: 0 animé: YES]; [settingsPageNaturalGasPicker reloadAllComponents]; } – Jeff

+0

Vous n'avez pas besoin de reloadAllComponents pour voir les modifications après la sélection. Et vérifiez si votre composant à l'index 0 a au moins 4 lignes pour permettre la sélection de la ligne avec l'index 3. – Morion

+0

Et si elle se bloque de toute façon, postez une erreur s'il vous plaît. – Morion