我正在尝试实现类似于 iTunes 浏览器的东西,以浏览简单的图书数据库。我有以下实体 - 作者、流派和图书。我想显示作者列表和流派列表,用于过滤主图书列表。
我尝试以两种不同的方式做到这一点 - 建模为:
Author ( has many ) Genres ( has many ) Books
...同一流派的多个实例,因此每个作者都有自己的给定流派名称,我有一个很好的向下钻取层次结构可以显示在我的表格 View 中(尽管重复流派有点不合逻辑)。但是,当我选择多个作者时,我最终会显示同一流派的重复内容,因为它们实际上是不同的对象。
因此,我尝试更明智地利用这些关系来做到这一点:
Author ( has many ) Books Book ( has one ) Genre
我可以通过在当前选定的作者书籍数组中获取流派的不同并集来获取流派数组,但现在我剩下的问题是根据所选流派过滤显示的书籍列表。因为流派是共享的,所以我不能只使用 CurrentGenre.books,否则我会丢失所选的作者过滤。我注意到界面生成器中的“过滤谓词”字段可在对象 Controller 上使用,但我一直在研究如何实际使用它来将所选流派作为过滤器应用到剧集列表。 The apple documentation说:
"You can type a predicate directly into the predicate editor text field in the inspector panel of Interface Builder or you can set it programmatically using setFetchPredicate:.
这给我的印象是我走在正确的轨道上,但也就到此为止了。我现在正在尝试以一种漂亮的 Cocoa 风格的方式锁定模型,以便最大限度地减少“粘合代码”位和以后的更改。这似乎是一个相当简单的问题,我应该能够在 IB 中以图形方式解决,但到目前为止我还没有解决!
提前致谢。
最佳答案
我对您在讨论中引入“剧集”感到有点困惑,但我假设您仍然指的是“书籍”。
您绝对走在正确的道路上。您想要一个像这样的数据模型:
作者<-->>书籍
类型 <-->> 书籍
或者甚至:
作者<<-->>书籍(如果您支持引用书等)
流派 <<-->> 图书(如果您想要多流派支持)
一旦用户选择了作者和流派,您将希望图书数组 Controller 使用仅显示具有这些作者或流派的书籍的过滤谓词。
更新
这应该有效:
- 将 Book 数组 Controller 的过滤谓词绑定(bind)到应用委托(delegate)中的新谓词属性“bookFilterPredicate”。
- 为“作者”和“流派”数组 Controller 添加导出。
- 观察两个数组 Controller 的
selectedObjects
属性的变化。 - 当其中任何一个发生更改时,请更新过滤谓词属性,如下所示:
self.bookFilterPredicate = [NSPredicate predicateWithFormat:@"author IN %@ && Genre IN %@",authorArrayController.selectedObjects,genreArrayController.selectedObjects];
关于Cocoa 数据层次结构和浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277915/