我希望使用2个NSPopupButtons制作城市/国家/地区选择器。一个弹出按钮将包含第一部分,例如英国,第二部分将包含第二部分,例如伦敦 因此整个城市/国家组合将为:英国伦敦 但是,我希望在选择第一部分时更新第二部分,例如,如果伦敦被选中,第二个弹出按钮的可能选择将是伦敦,伯明翰,曼彻斯特等,而如果选择意大利,那么第二个弹出按钮将显示威尼斯,米兰等国家。
之后,我想将这些数据存储在Core Data中的一个属性中。所以要将两者结合在一起,并将“UK London”存储在一个名为“place”的属性中。
有人可以帮我解决一下如何实施这个问题吗?
谢谢!
答案 0 :(得分:2)
您如何存储您的国家/城市数据(他们也在核心数据中)?这将确定一些细节,但基本思想是使用Cocoa绑定将每个NSPopUpButton链接到NSArrayController的内容。
Cocoa Bindings并不是非常简单,但是一旦你正确配置了所有内容,它们确实像魔术一样工作。麻烦的是,当你没有正确配置东西时,很难确定出了什么问题。
以下是一般设置:
您将第一个NSArrayController配置为您的国家/地区数据的内容。如果您使用Core Data,则将其传递给托管对象上下文,并让它为您的Country
实体准备自己的数据。否则,您必须将其内容绑定到现有的对象数组,这些对象实现了访问其链接城市的Key-Value Coding compliant方法。在这里使用数据源的核心数据将使您的生活更轻松。
然后将第二个NSArrayController绑定到从第一个selection
获取其内容,并使用适当的关键路径指向您的城市。使用核心数据,这将是Content Set
(因为它是无序的)。
编辑:Bah,评论字段完全没用。以下是对您的第一条评论的正确回复:
要在Core Data中建模此关系,您需要将模型设置为如下所示:
重要的是要注意我已经为我的实体提供了自定义类(MBCountry
和MBCity
)。通过让Xcode为您生成类(选择实体,转到New File ...,然后选择Cocoa Class - > Managed Object Class),您可以使用真正的访问器方法(而不仅仅是valueForKey:
) 。 (顺便说一句,我非常重视Rentzsch's 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,因此这为学习提供了很好的机会。它有一个非常陡峭的学习曲线(当然是Cocoa API最棘手的方面之一),但它是可行的。只是继续堵塞!