NSPopupButton,取决于另一个NSPopupButton更新
-
20-09-2019 - |
题
我希望使使用2个NSPopupButtons一个城市/国家选择器。一个弹出按钮将包含所述第一部分例如英国,而第二个将包含所述第二部分例如伦敦 所以整个城市/国家组合将阅读:英国伦敦 然而,我想选择第一部分时,将要更新的第二部分例如如果选择伦敦,在第二弹出式按钮的可能的选择将是伦敦,伯明翰,曼彻斯特等,而如果意大利被选择,则第二弹出式按钮将显示如威尼斯,米兰等
的国家然后,我想这个数据存储在在核心数据一个属性。所以加入了两人在一起,和存储“英国伦敦”在一个名为“地方”属性。
任何人可以给我一些帮助,如何去实现这个好吗?
谢谢!
解决方案
你怎么会有存储在您的国家/城市数据(是他们也是在核心数据)?这将决定一些细节在这里,但基本的想法是,你使用Cocoa绑定到每个NSPopUpButton链接到一个NSArrayController的内容。
Cocoa绑定不非常简单,但他们真的像变魔术一样工作,一旦你做好一切正确配置。麻烦的是,当你没有的东西正确配置,很难确定什么错误。
这里的一般设置:
您配置的第一个NSArrayController的是你的国家数据的内容。如果你使用的核心数据,那么你通过它的管理对象上下文,并将它准备自己的数据为您Country
实体。否则,你将不得不对其内容绑定到实施的键 - 值编码访问其连接城市的兼容方法。使用核心数据对于这里的数据源,将让您的生活更轻松。
然后你绑定的第二NSArrayController的到得到它从第一的selection
内容,用你的城市相应的关键路径。与核心数据,这将是Content Set
(因为它是无序的)。
修改强>呸,注释字段是完全没有价值。这里是你的第一个评论作出恰当的回应:
为了模拟在核心数据这层关系,你会设置你的模型是这样的:
要注意,我已经给我的实体的自定义类(MBCountry
和MBCity
)是非常重要的。通过询问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的最棘手的问题当然是一个),但它是可行的。只要继续刻苦!