2010-03-09 24 views
9

Je suis un programmeur .NET et nouvelle à l'objectif C.UIPickerView avec NSDictionary

Je suis en train de faire une UIPickerView qui agit comme un dropdownlist .NET. L'utilisateur voit la liste de texte et en sélectionne un et la valeur sélectionnée (qui est l'ID) est utilisée dans le code.

J'ai parcouru pendant presque une demi-journée en essayant de comprendre cela. Je pourrais ajouter un PickerView régulier avec une liste de chaînes, une vue de sélecteur avec des composants multiples et une vue de sélecteur avec des composants dépendants dont aucun ne semble répondre à ma requête.

Aidez-nous s'il vous plaît.

+0

Le UIPickerView est ne va pas regarder ou se comporter exactement comme la liste déroulante .net mais la fonctionnalité essentielle est là. Mis à part l'apparence, y a-t-il un problème spécifique que vous rencontrez? – DyingCactus

+0

Je veux juste utiliser une paire clé-valeur pour la source de données pour UIPickerView. On dirait que ce n'est pas possible. J'ai un NSObject personnalisé [avec les propriétés Nom et ID]. Je définis les noms à afficher sur l'UIPickerView. Lorsque l'utilisateur sélectionne un nom, je dois trouver l'identifiant du nom et l'utiliser. Merci pour votre réponse. – Dave

Répondre

13

Vous pouvez utiliser un NSDictionary comme source de données pour UIPickerView mais si vous avez un objet NSObject personnalisé qui contient déjà la paire clé/valeur, il serait plus simple d'utiliser un NSArray de ces objets comme source de données.

Supposons que l'objet personnalisé est Planet avec les propriétés planetId (int) et planetName (NSString). Créez un NSArray appelé planètes avec les objets dans l'ordre dans lequel vous voulez qu'ils apparaissent dans le sélecteur (ils ne doivent pas nécessairement être dans l'ordre planetId).

En titleForRow, vous feriez:

return ((Planet *)[planets objectAtIndex:row]).planetName; 

En didSelectRow, pour obtenir la planète sélectionnée:

Planet *selectedPlanet = (Planet *)[planets objectAtIndex:row]; 

// //

Avec un NSDictionary, vous devez mapper les valeurs clés au numéro de ligne du sélecteur. Une façon de faire est de simplement définir les valeurs de clé pour les numéros de ligne et ajouter les objets personnalisés en tant que valeurs.

Ainsi le dictionnaire serait créé comme ceci:

NSArray *keys = [NSArray arrayWithObjects:@"0", @"1", @"2", @"3", nil]; 
NSArray *values = [NSArray arrayWithObjects:mercury, venus, earth, mars, nil]; 
items = [[NSDictionary dictionaryWithObjects:values forKeys:keys] retain]; 

En titleForRow, vous feriez:

NSString *itemKey = [NSString stringWithFormat:@"%d", row]; 
Planet *planet = (Planet *)[items objectForKey:itemKey]; 
return planet.planetName; 

En didSelectRow, vous feriez:

NSString *itemKey = [NSString stringWithFormat:@"%d", row]; 
Planet *selectedPlanet = (Planet *)[items objectForKey:itemKey]; 
+0

Cela a fonctionné! Merci – Dave

+1

Exactement ce que je cherchais, merci @DyingCactus! –

+1

Puis-je obtenir ce code dans Swift –