NSPopupButton, обновления в зависимости от другого NSPopupButton - PullRequest
1 голос
/ 17 ноября 2009

Я хочу сделать выбор города / страны с помощью 2 кнопок NSPopup. Одна всплывающая кнопка будет содержать первую часть, например, Великобритания, и вторая будет содержать вторую часть, например Лондон Таким образом, весь город / страна будет выглядеть так: Великобритания, Лондон однако я хочу, чтобы вторая часть была обновлена ​​при выборе первой части, например, если выбран Лондон, во втором всплывающем кнопке можно выбрать Лондон, Бирмингем, Манчестер и т. д., а в случае выбора Италии во втором всплывающем окне отображаются такие страны, как Венеция, Милан и т. д.

Впоследствии я хотел бы сохранить эти данные в одном атрибуте в Базовых данных. так что соедините их вместе и храните «UK London» в атрибуте «place».

Может ли кто-нибудь помочь мне с реализацией, пожалуйста?

Спасибо!

1 Ответ

2 голосов
/ 17 ноября 2009

Как хранятся данные вашей страны / города (они также находятся в Базовых данных)? Это определит некоторые подробности здесь, но основная идея заключается в том, что вы используете привязки Какао для связи каждого NSPopUpButton с содержимым NSArrayController.

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

Вот общие настройки:

Вы настраиваете первый NSArrayController как содержимое ваших Страновых Данных. Если вы используете Core Data, вы передаете ему контекст управляемого объекта и подготавливаете его к созданию собственных данных для вашей Country сущности. В противном случае вам придется привязать его содержимое к существующему массиву объектов, которые реализуют совместимый с кодированием значения ключа *1011* метод доступа к их связанным городам. Использование основных данных для источника данных здесь облегчит вашу жизнь.

И затем вы привязываете второй NSArrayController к получению его содержимого из selection первого, с соответствующим ключевым путем к вашим городам. С Core Data это будет Content Set (так как он неупорядочен).

<ч />

Редактировать: Бах, поля комментариев абсолютно бесполезны. Вот правильный ответ на ваш первый комментарий:

Чтобы смоделировать эту взаимосвязь в Базовых данных, вы должны настроить свою модель так:

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

Базовые данные на самом деле способ здесь излишни. Тем не менее, звучит так, будто вы хотите использовать Базовые данные в других разделах вашей программы, так что это дает отличную возможность для обучения. У этого есть очень крутая кривая изучения (конечно, один из самых хитрых аспектов API Какао), но это выполнимо. Просто продолжайте подключаться!

...