Как хранятся данные вашей страны / города (они также находятся в Базовых данных)? Это определит некоторые подробности здесь, но основная идея заключается в том, что вы используете привязки Какао для связи каждого NSPopUpButton с содержимым NSArrayController.
Привязки какао не так уж и просты, но они действительно работают как по волшебству, когда все настроено правильно. Проблема в том, что когда у вас не все настроено правильно, трудно определить, что происходит не так.
Вот общие настройки:
Вы настраиваете первый NSArrayController как содержимое ваших Страновых Данных. Если вы используете Core Data, вы передаете ему контекст управляемого объекта и подготавливаете его к созданию собственных данных для вашей Country
сущности. В противном случае вам придется привязать его содержимое к существующему массиву объектов, которые реализуют совместимый с кодированием значения ключа *1011* метод доступа к их связанным городам. Использование основных данных для источника данных здесь облегчит вашу жизнь.
И затем вы привязываете второй NSArrayController к получению его содержимого из selection
первого, с соответствующим ключевым путем к вашим городам. С Core Data это будет Content Set
(так как он неупорядочен).
<ч />
Редактировать: Бах, поля комментариев абсолютно бесполезны. Вот правильный ответ на ваш первый комментарий:
Чтобы смоделировать эту взаимосвязь в Базовых данных, вы должны настроить свою модель так:
Важно отметить, что я дал своим сущностям пользовательские классы (MBCountry
и MBCity
). Попросив Xcode сгенерировать классы для вас (выберите сущность, перейдите в Новый файл ... и выберите Класс какао -> Класс управляемых объектов), вы можете использовать реальные методы доступа (вместо просто valueForKey:
). (Кроме того, я действительно ценю генератор Рентша , который делает это автоматически для вас при каждом сохранении.)
Теперь, когда ваша модель настроена, вы можете заполнить хранилище данных следующим образом:
NSArray *countryList = ...; /* Get your array of country names */
for (NSString *countryName in countryList) {
MBCountry *aCountry = (MBCountry *)[NSEntityDescription insertNewObjectForEntityForName:@"MBCountry" inManagedObjectContext:context];
[aCountry setName:countryName];
NSArray *cityList = ... /* Get your array of city names for this country */
for (NSString *cityName in cityList) {
MBCity *aCity = (MBCity *)[NSEntityDescription insertNewObjectForEntityForName:@"MBCity" inManagedObjectContext:context];
[aCity setName:cityName];
[aCountry addCitiesObject:aCity];
}
}
Базовые данные на самом деле способ здесь излишни. Тем не менее, звучит так, будто вы хотите использовать Базовые данные в других разделах вашей программы, так что это дает отличную возможность для обучения. У этого есть очень крутая кривая изучения (конечно, один из самых хитрых аспектов API Какао), но это выполнимо. Просто продолжайте подключаться!