NSPopupButton, обновления в зависимости от другого NSPopupButton

StackOverflow https://stackoverflow.com/questions/1745153

Вопрос

Я хочу сделать переключатель города/страны, используя 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, вам нужно настроить свою модель следующим образом:

Xcode Model Editor Screenshot

Важно отметить, что я предоставил своим сущностям специальные классы (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), но это выполнимо.Просто продолжайте подключаться!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top