Использование вложенного NSDictionary с Picker - PullRequest
0 голосов
/ 21 июля 2011

Новичок здесь,

У меня есть один компонент выбора, установленный из plist, с каждым элементом, являющимся массивом, с несколькими строками в каждом массиве, который использует приложение.

В настоящее времяСтруктура plist выглядит следующим образом:

NSDictionary  ->  NSArray  ->  NSString
                     |             |
            Items in Picker     Data for each Item

Но теперь я хочу:

NSDictionary  ->  NSDictionary  ->  NSArray  ->  NSString
                      |                |              |
  DIfferent Picker Data Sets      Items in Picker   Data for each Item

Так что теперь будет несколько наборов компонентов выбора, которые я бы показал с использованием сегментированного элемента управления и т. д...

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

Что меня озадачило, так это просто получить всеправильно принятый

Это то, что у меня есть сейчас, оно успешно строится, но падает (отладочная информация ниже):

NSBundle *bundle = [NSBundle mainBundle];

NSString *plistPath = [bundle pathForResource:@"CamerasDatabase" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.allCameras = dictionary;
[dictionary release];

NSArray *cameraTypes = [self.allCameras allKeys];
self.CamTypes = cameraTypes;

NSArray *items = [self.CamTypes objectAtIndex:0];
self.Cameras = items;

NSString *selectedCamera = [self.Cameras objectAtIndex:0];
NSArray *array = [CamsList objectForKey:selectedCam];
self.cameraData = array;

Я пробовал много разных комбинаций словарей, массивов и строк, так чтоЯ уверен, что приведенный выше код испорчен.

Сбой в:

NSString *selectedCamera = [self.Cameras objectAtIndex:0];

с "- [NSCFString objectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x4e127f0"

1 Ответ

0 голосов
/ 21 июля 2011

Очевидно, что у вас есть NSString объекты (ключи) в self.CamTypes.Не NSArray.

, поэтому эти строки недействительны

NSArray *items = [self.CamTypes objectAtIndex:0];
self.Cameras = items;

NSString *selectedCamera = [self.Cameras objectAtIndex:0]; //this line is cause of exception.

для исправления этого кода записи, например,

NSBundle *bundle = [NSBundle mainBundle];

NSString *plistPath = [bundle pathForResource:@"CamerasDatabase" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.allCameras = [dictionary valueForKey:@"Key "];//Key for accesing your inner dictionary
[dictionary release];



NSArray *cameraTypes = [self.allCameras allKeys];
self.CamTypes = cameraTypes;


NSArray *items = [self.allCameras valueForKey:[self.CamTypes objectAtIndex:0]];
self.Cameras = items;

NSString *selectedCamera = [self.Cameras objectAtIndex:0];
NSArray *array = [CamsList objectForKey:selectedCam];
self.cameraData = array;

, поэтому в приведенном выше коде self.allCameras являетсясловарь, имеющий массивы, соответствующие разным ключам (cameraTypes, находящиеся в self.CamTypes).

...