NSPopupButton,根据另一个NSPopupButton进行更新

时间:2009-11-16 22:05:27

标签: objective-c macos core-data nspopupbuttoncell

我希望使用2个NSPopupButtons制作城市/国家/地区选择器。一个弹出按钮将包含第一部分,例如英国,第二部分将包含第二部分,例如伦敦 因此整个城市/国家组合将为:英国伦敦 但是,我希望在选择第一部分时更新第二部分,例如,如果伦敦被选中,第二个弹出按钮的可能选择将是伦敦,伯明翰,曼彻斯特等,而如果选择意大利,那么第二个弹出按钮将显示威尼斯,米兰等国家。

之后,我想将这些数据存储在Core Data中的一个属性中。所以要将两者结合在一起,并将“UK London”存储在一个名为“place”的属性中。

有人可以帮我解决一下如何实施这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您如何存储您的国家/城市数据(他们也在核心数据中)?这将确定一些细节,但基本思想是使用Cocoa绑定将每个NSPopUpButton链接到NSArrayController的内容。

Cocoa Bindings并不是非常简单,但是一旦你正确配置了所有内容,它们确实像魔术一样工作。麻烦的是,当你没有正确配置东西时,很难确定出了什么问题。

以下是一般设置:

您将第一个NSArrayController配置为您的国家/地区数据的内容。如果您使用Core Data,则将其传递给托管对象上下文,并让它为您的Country实体准备自己的数据。否则,您必须将其内容绑定到现有的对象数组,这些对象实现了访问其链接城市的Key-Value Coding compliant方法。在这里使用数据源的核心数据将使您的生活更轻松。

然后将第二个NSArrayController绑定到从第一个selection获取其内容,并使用适当的关键路径指向您的城市。使用核心数据,这将是Content Set(因为它是无序的)。


编辑:Bah,评论字段完全没用。以下是对您的第一条评论的正确回复:

要在Core Data中建模此关系,您需要将模型设置为如下所示:

Xcode Model Editor Screenshot

重要的是要注意我已经为我的实体提供了自定义类(MBCountryMBCity)。通过让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最棘手的方面之一),但它是可行的。只是继续堵塞!