UIPickerView с NSDictionary - PullRequest
       13

UIPickerView с NSDictionary

9 голосов
/ 09 марта 2010

Я программист .NET и новичок в Objective C.

Я пытаюсь создать UIPickerView, который работает как выпадающий список .NET. Пользователь видит список текста и выбирает его, а выбранное значение (которое является идентификатором) используется в коде.

Я просматриваю почти полдня, пытаясь понять это. Я мог бы добавить обычный PickerView со списком строк, представлением выбора с несколькими компонентами и представлением выбора с зависимыми компонентами, ни один из которых, кажется, не отвечает на мой запрос.

Пожалуйста, помогите.

1 Ответ

13 голосов
/ 10 марта 2010

Вы можете использовать NSDictionary в качестве источника данных для UIPickerView, но если у вас есть пользовательский NSObject, который уже содержит пару ключ / значение, тогда было бы проще использовать NSArray этих объектов в качестве источника данных.

Предположим, что пользовательский объект Planet со свойствами planetId (int) и planetName (NSString). Создайте NSArray, называемый планетами, с объектами в том порядке, в котором вы хотите, чтобы они появлялись в палитре (они не обязательно должны быть в порядке planetId).

В titleForRow вы должны сделать:

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

В didSelectRow, чтобы получить выбранную планету:

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

//
//
С NSDictionary вам нужно будет сопоставить значения ключа с номером строки средства выбора. Один из способов сделать это - просто установить ключевые значения для номеров строк и добавить пользовательские объекты в качестве значений.

Таким образом, словарь будет создан следующим образом:

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];

В titleForRow вы должны сделать:

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

В didSelectRow вы должны сделать:

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