您如何存储您的国家/城市数据(它们也在 Core Data 中)?这将确定这里的一些细节,但基本思想是使用 Cocoa 绑定将每个 NSPopUpButton 链接到 NSArrayController 的内容。
Cocoa Bindings并不是非常简单,但是一旦您正确配置了所有内容,它们确实会像魔术一样工作。问题是当你没有正确配置东西时,很难确定出了什么问题。
这是一般设置:
您将第一个 NSArrayController 配置为 Country Data 的内容。Country
如果您使用 Core Data,那么您将托管对象上下文传递给它,并让它为您的实体准备自己的数据。否则,您必须将其内容绑定到现有的对象数组,这些对象实现了访问其链接城市的符合键值编码的方法。在这里使用核心数据作为数据源将使您的生活更轻松。
然后你将第二个 NSArrayController 绑定到从第一个获取它的内容selection
,并使用适当的关键路径到你的城市。使用 Core Data,这将是Content Set
(因为它是无序的)。
编辑:呸,评论字段完全没有价值。这是对您的第一条评论的正确回应:
要在 Core Data 中对这种关系进行建模,您需要将模型设置为如下所示:
需要注意的是,我已经为我的实体提供了自定义类(MBCountry
和MBCity
)。通过让 Xcode 为您生成类(选择实体,转到 New File...,然后选择 Cocoa Class -> Managed Object Class),您可以使用真正的访问器方法(而不仅仅是valueForKey:
)。(顺便说一句,我真的很重视Rentzsch 的 Mogenerator,它会在每次保存时自动为您执行此操作。)
现在您的模型已设置好,您可以像这样填充数据存储:
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 在这里确实有点矫枉过正。但是,听起来您想在程序的其他部分使用 Core Data,因此这是一个很好的学习机会。它有一个非常陡峭的学习曲线(当然是 Cocoa API 最棘手的方面之一),但它是可行的。只是继续插电!