2010-06-03 14 views
0

J'ai une classe avec 4 tableaux: tab_1, tab_2, tab_3 et tab_T. J'ai défini le délégué et la source de données du sélecteur sur self (qui est la classe contenant les tableaux).un sélecteur, plusieurs tableaux pour datasources - fonctionne bien mais comment?

Le sélecteur est appelé lorsque les champs de texte commencent à être modifiés. Je renvoie NON afin d'empêcher l'affichage du clavier. J'ai une méthode d'animation du sélecteur à la place.

Selon le textfield est touché que je fais: tab_T = tab_1; ou 2 ou 3

À mon avis, cette mission fait tab_T la source de données du sélecteur. Cette affectation lie-t-elle réellement le tableau tab_T à la source de données? Y a-t-il un moyen de l'assigner manuellement? Je suis sûr qu'il y en a. Mais picker.datasource = tab_1 ne fonctionne pas. J'ai un "avertissement: la classe 'NSMutableArray' n'implémente pas le protocole 'UIPickerViewDataSource'".

Son ma première application peut-être j'oublie une étape je l'ai fait au début des âges de mon application.

Dans l'attente de quiconque veut aider.

Wallou

Répondre

2

est une source de données UIPickerView doit être une classe qui implémente le protocole UIPickerViewDataSource. Le peuplement de la vue du sélecteur se fait dans ces deux méthodes:

– numberOfComponentsInPickerView: 
– pickerView:numberOfRowsInComponent: 

Depuis NSArray ne met pas en œuvre le protocole en utilisant:

pickerView.datasource=someArray; 

... génère l'erreur que vous avez vu dire le tableau n'implémente pas le protocole.

La première chose que vous devez faire est de déclarer que votre contrôleur implémente le protocole comme ceci:

@interface MyControllerClass: UIViewController <UIPickerViewDataSource,UIPickerViewDelegate> 

alors vous devez mettre en œuvre les méthodes du protocole qui ressemble à quelque chose comme:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 
    return 1; //or whatever 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 
    return [self.tab_T count]; // assuming just one component 
} 

Pour remplir réellement les composants, vous avez besoin des méthodes UIPickerViewDelegate. (Je sais, il semble que la source de données doit fournir, vous savez, les données, mais pour une raison quelconque, ils ont en arrière.)

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    return [self.tab_T objectAtIndex:row]; //assuming one component 
} 

L'idée clé ici est que les objets qui mettent en œuvre les méthodes de DataSource et délégué servent l'interface entre le sélecteur et la structure de données qui contient les données. Dans ce cas, il s'agit simplement de tableaux simples, mais il peut s'agir de n'importe quoi, y compris les données de base, SQL ou téléchargé à partir d'une URL.

Le pickerview ne traite directement avec la structure de données du tout. C'est toujours le ou les objets qui implémentent les méthodes de source de données et de délégation qui effectuent l'interaction.

+0

matin TechZen, Ok, merci pour cette réponse, claire et complète. Je comprends mieux maintenant le comportement du sélecteur. Au revoir, Wallou – wallou