È possibile utilizzare un NSDictionary come origine dati per UIPickerView ma se si dispone di un NSObject personalizzato che contiene già la coppia chiave/valore, sarebbe più semplice utilizzare un NSArray di tali oggetti come origine dati.
Si supponga che l'oggetto personalizzato sia Pianeta con le proprietà planetId (int) e planetName (NSString). Crea un NSArray chiamato pianeti con gli oggetti nell'ordine in cui vuoi che appaiano nel selettore (non devono essere in ordine planetId).
In titleForRow, si dovrebbe fare:
return ((Planet *)[planets objectAtIndex:row]).planetName;
In didSelectRow, per ottenere il pianeta selezionato:
Planet *selectedPlanet = (Planet *)[planets objectAtIndex:row];
// //
Con una NSDictionary, si dovrebbe mappare i valori chiave al numero di riga del selettore. Un modo per farlo è semplicemente impostare i valori delle chiavi sui numeri di riga e aggiungere gli oggetti personalizzati come valori.
Così il dizionario sarebbe creato in questo modo:
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];
In titleForRow, si farebbe:
NSString *itemKey = [NSString stringWithFormat:@"%d", row];
Planet *planet = (Planet *)[items objectForKey:itemKey];
return planet.planetName;
In didSelectRow, si farebbe:
NSString *itemKey = [NSString stringWithFormat:@"%d", row];
Planet *selectedPlanet = (Planet *)[items objectForKey:itemKey];
L'UIPickerView è non andando a guardare o comportarsi esattamente come il. droplist, ma la funzionalità essenziale è lì. A parte l'aspetto, c'è un problema specifico che stai avendo? – DyingCactus
voglio solo utilizzare una coppia chiave-valore per l'origine dati per UIPickerView. Sembra che non sia possibile. Ho un NSObject personalizzato [con proprietà Nome e ID]. Ho impostato i nomi da visualizzare su UIPickerView. Quando l'utente seleziona un nome, ho bisogno di trovare l'ID del nome e usarlo. Grazie per la risposta. – Dave