代码之家  ›  专栏  ›  技术社区  ›  Michael

nspoupbutton,根据另一个nspoupbutton更新

  •  1
  • Michael  · 技术社区  · 15 年前

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

    然后,我想将这些数据存储在核心数据中的一个属性中。因此,要将两者结合起来,并将“英国伦敦”存储在一个名为“地点”的属性中。

    有人能帮我一下怎么实施吗?

    谢谢您!

    1 回复  |  直到 15 年前
        1
  •  2
  •   mbauman    15 年前

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

    Cocoa Bindings 不是非常简单,但一旦你正确配置了所有的东西,它们确实像魔术一样工作。问题是,当您没有正确配置事物时,很难确定出哪里出了问题。

    以下是常规设置:

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

    然后将第二个nsarraycontroller绑定到从 selection 首先,用适当的关键路径去你的城市。对于核心数据,这将是 Content Set (因为这是无序的)。


    编辑: 啊,评论栏完全没用。以下是对您第一条评论的正确回应:

    要在核心数据中建模此关系,您需要将模型设置为如下所示:

    Xcode Model Editor Screenshot

    需要注意的是,我已经为我的实体提供了自定义类( MBCountry MBCity )通过要求xcode为您生成类(选择实体,转到新文件…,然后选择cocoa类->托管对象类),您可以使用真正的访问器方法(而不是 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];
        }
    }
    

    核心数据实际上是 方式 这里杀得太多了。然而,听起来你想在课程的其他部分使用核心数据,所以这是一个很好的学习机会。它有一个非常陡峭的学习曲线(当然是CocoaAPI最棘手的方面之一),但它是可行的。继续插电!

    推荐文章