NSPopupButton, обновления в зависимости от другого NSPopupButton
-
20-09-2019 - |
Вопрос
Я хочу сделать переключатель города/страны, используя 2 NSPopupButtons.Одна всплывающая кнопка будет содержать первую часть, например.UK, а второй будет содержать вторую часть, например.Лондон, так что весь город/страновой комбинация будет читать:Великобритания Лондон, однако, я хочу, чтобы вторая часть была обновлена, когда выбирается первая часть, например,если выбран Лондон, во второй всплывающей кнопке можно будет выбрать Лондон, Бирмингем, Манчестер и т. д., а если выбрана Италия, то вторая всплывающая кнопка отобразит такие страны, как Венеция, Милан и т. д.
Впоследствии я хотел бы сохранить эти данные в одном атрибуте в Core Data.поэтому объедините их вместе и сохраните «UK London» в атрибуте под названием «place».
Может ли кто-нибудь помочь мне, как это реализовать, пожалуйста?
Спасибо!
Решение
Как у вас хранятся данные о вашей стране/городе (они также находятся в Core Data)?Это определит некоторые детали, но основная идея заключается в том, что вы используете привязки Cocoa для связи каждого NSPopUpButton с содержимым NSArrayController.
Переплеты какао не так уж и просты, но они действительно работают как по волшебству, если вы все настроили правильно.Проблема в том, что если все настроено неправильно, трудно определить, что идет не так.
Вот общая установка:
Вы настраиваете первый NSArrayController как содержимое ваших данных о стране.Если вы используете Core Data, вы передаете ему контекст управляемого объекта и заставляете его подготовить свои собственные данные для вашего Country
сущность.В противном случае вам придется привязать его содержимое к существующему массиву объектов, реализующих Совместимость с кодированием ключевых значений метод доступа к связанным городам.Использование основных данных в качестве источника данных здесь облегчит вашу жизнь.
А затем вы привязываете второй NSArrayController к получению его содержимого из selection
первого, с соответствующим ключом пути к вашим городам.С Core Data это будет Content Set
(поскольку он неупорядочен).
Редактировать: Ба, поля комментариев совершенно бесполезны.Вот правильный ответ на ваш первый комментарий:
Чтобы смоделировать эти отношения в Core Data, вам нужно настроить свою модель следующим образом:
Важно отметить, что я предоставил своим сущностям специальные классы (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];
}
}
Основные данные действительно способ здесь перебор.Однако похоже, что вы хотите использовать Core Data в других разделах вашей программы, так что это дает прекрасную возможность обучения.Кривая обучения очень сложна (безусловно, это один из самых сложных аспектов Cocoa API), но это выполнимо.Просто продолжайте подключаться!