【问题标题】:Cocoa data hierarchy and browserCocoa 数据层次结构和浏览器
【发布时间】:2010-02-17 02:21:15
【问题描述】:

我正在尝试实现类似于 iTunes 浏览器的功能,以浏览一个简单的图书数据库。我有以下实体 - AuthorGenreBook。我想显示一个作者列表和一个流派列表,用于过滤主图书列表。
我曾尝试以 2 种不同的方式执行此操作 - 建模为:

Author ( has many ) Genres ( has many ) Books

...具有相同流派的多个实例,因此每个作者都有自己的给定流派名称,我有一个很好的向下钻取层次结构显示在我的表视图中(尽管复制流派有点不合逻辑)。但是,当我选择多个作者时,我最终会显示相同类型的副本,因为它们实际上是不同的对象。

所以,我尝试更明智地处理这些关系:

Author ( has many ) Books  
Book ( has one ) Genre

我可以通过在当前选定的 Author(s) book 数组中获取 Genre 的不同并集来获取 Genre 数组,但是现在我遇到了根据选定的 Genre 过滤显示的书籍列表的问题.因为流派是共享的,所以我不能只使用 CurrentGenre.books,否则我会丢失选定的作者过滤。我注意到界面构建器中的“过滤器谓词”字段,可在对象控制器上使用,但我一直在研究如何实际使用它来将选定的流派作为过滤器应用于剧集列表。 The apple documentation 说:

"您可以直接键入谓词 进入谓词编辑器文本字段 在界面的检查面板中 生成器,或者您可以设置它 以编程方式使用 setFetchPredicate:.

这给我的印象是我在正确的轨道上,但这就是它的结束。我现在正试图以一种不错的 Cocoa 风格锁定模型,以便最大限度地减少“胶水代码”位和以后的更改。这似乎是一个相当简单的问题,我应该能够在 IB 中以图形方式解决,但到目前为止它还没有解决!

提前致谢。

【问题讨论】:

    标签: cocoa core-data cocoa-bindings


    【解决方案1】:

    您在讨论中引入“情节”让我有点困惑,但我会假设您仍然只是指“书籍”。

    您绝对是在正确的轨道上。你想要这样的数据模型:

    作者 > 书籍
    类型 > 书籍

    或者甚至:
    作者 > 书籍(如果您支持参考书等)
    流派 > 书籍(如果您想要多流派支持)

    一旦用户选择了作者和流派,您将希望 Book 数组控制器使用过滤谓词,仅显示具有这些作者或流派的书籍。

    更新
    这应该有效:

    1. 将 Book 数组控制器的过滤谓词绑定到应用委托中的新谓词属性“bookFilterPredicate”。
    2. 为 Author 和 Genre 阵列控制器添加插座。
    3. 观察两个阵列控制器的selectedObjects 属性的变化。
    4. 当任一更改时,更新过滤谓词属性,如下所示:self.bookFilterPredicate = [NSPredicate predicateWithFormat:@"author IN %@ && genre IN %@",authorArrayController.selectedObjects,genreArrayController.selectedObjects];

    【讨论】:

    • 哎呀,我在玩弄不同的例子来尽可能简单地解释问题,结果不一致。我应该更清楚 - 我知道我必须应用谓词来过滤数组控制器,但我不确定如何在 IB 中建立这种关系,如果可能的话,或者我是否必须回过头来写一些胶水把它绑在一起?
    • 认为您必须使用代码,因为我看不到任何方法可以从过滤谓词中的任何(并且您将从两个)数组控制器中提取信息盒子。
    • 我也有同样的怀疑,但苹果文档中的引用让我失望了!看起来很棒,干杯。
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2012-10-13
    • 2012-12-03
    • 2012-07-30
    • 2016-03-28
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多