我希望使使用2个NSPopupButtons一个城市/国家选择器。一个弹出按钮将包含所述第一部分例如英国,而第二个将包含所述第二部分例如伦敦 所以整个城市/国家组合将阅读:英国伦敦 然而,我想选择第一部分时,将要更新的第二部分例如如果选择伦敦,在第二弹出式按钮的可能的选择将是伦敦,伯明翰,曼彻斯特等,而如果意大利被选择,则第二弹出式按钮将显示如威尼斯,米兰等

的国家

然后,我想这个数据存储在在核心数据一个属性。所以加入了两人在一起,和存储“英国伦敦”在一个名为“地方”属性。

任何人可以给我一些帮助,如何去实现这个好吗?

谢谢!

有帮助吗?

解决方案

你怎么会有存储在您的国家/城市数据(是他们也是在核心数据)?这将决定一些细节在这里,但基本的想法是,你使用Cocoa绑定到每个NSPopUpButton链接到一个NSArrayController的内容。

Cocoa绑定不非常简单,但他们真的像变魔术一样工作,一旦你做好一切正确配置。麻烦的是,当你没有的东西正确配置,很难确定什么错误。

这里的一般设置:

您配置的第一个NSArrayController的是你的国家数据的内容。如果你使用的核心数据,那么你通过它的管理对象上下文,并将它准备自己的数据为您Country实体。否则,你将不得不对其内容绑定到实施的键 - 值编码访问其连接城市的兼容方法。使用核心数据对于这里的数据源,将让您的生活更轻松。

然后你绑定的第二NSArrayController的到得到它从第一的selection内容,用你的城市相应的关键路径。与核心数据,这将是Content Set(因为它是无序的)。


修改呸,注释字段是完全没有价值。这里是你的第一个评论作出恰当的回应:

为了模拟在核心数据这层关系,你会设置你的模型是这样的:

“Xcode的模型编辑器屏幕截图”

要注意,我已经给我的实体的自定义类(MBCountryMBCity)是非常重要的。通过询问Xcode中生成的类为你(选择实体,去到新文件...,然后选择可可类 - >管理对象类),你可以使用真正的存取方法(而不是仅仅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];
    }
}

核心数据确实是的办法的矫枉过正这里。然而,这听起来像你想在你的程序的其他部分使用核心数据,那么这将产生一个很好的学习机会。它有一个非常陡峭的学习曲线(可可API的最棘手的问题当然是一个),但它是可行的。只要继续刻苦!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top