Cocoa数据层次结构和浏览器

3
我想实现类似于iTunes浏览器的东西,以浏览一个简单的书籍数据库。我有以下实体- 作者类型书籍。我想显示一个作者列表和一个类型列表,它们可以作为过滤主要书籍列表的作用。
我已经尝试了两种不同的方式来建模:
Author ( has many ) Genres ( has many ) Books

我有多个相同流派的实例,所以每个作者都有自己的流派名称,我有一个不错的下钻层次结构可以在我的表视图中显示(尽管复制流派有点不合逻辑)。然而,当我选择多个作者时,我最终会显示相同流派的重复内容,因为它们实际上是不同的对象。

因此,我尝试使用以下关系更明智地完成:

Author ( has many ) Books  
Book ( has one ) Genre
我可以通过对当前选择的作者书籍数组中Genre取不同的并集来获取Genre数组,但现在我面临一个问题,即如何根据所选的Genre筛选显示的书籍列表。因为Genre是共享的,所以我不能只使用CurrentGenre.books,否则我就会失去所选作者的过滤。我注意到了接口构建器中对象控制器上可用的“过滤谓词”字段,但卡在了如何实际使用它将所选的Genre应用为过滤器以筛选剧集列表。苹果文档说:

“您可以直接将谓词键入 到Interface Builder的检查器面板中的谓词编辑器文本字段中, 或者您可以使用setFetchPredicate:编程方式设置它。

这让我觉得我在正确的轨道上,但这也是它的尽头。我现在正在试图以漂亮的Cocoa风格锁定模型,以便最小化后续的“胶水代码”和更改。这似乎是一个相当简单的问题,我应该能够在IB中以图形方式解决它,但到目前为止,它已经使我束手无策了!

提前致谢。

1个回答

2
我对你在讨论中提到“episodes”有点困惑,但我会假设你仍然是指“books”。
你的方向完全正确。您需要这样的数据模型:
作者 <-->> 书籍
类型 <-->> 书籍
甚至可能是:
作者 <<-->> 书籍(如果支持参考书等)
类型 <<-->> 书籍(如果需要多种类型支持)
一旦用户选择了作者和类型,您将需要一个书籍数组控制器来使用过滤谓词,仅显示具有这些作者或类型的书籍。
更新:
以下内容应该可以解决问题:
1. 将书籍数组控制器的过滤谓词绑定到您的应用程序委托中的新谓词属性“bookFilterPredicate”。 2. 添加作者和类型数组控制器的输出口。 3. 观察两个数组控制器的selectedObjects属性的更改。 4. 当任何一个发生变化时,像这样更新过滤谓词属性:`self.bookFilterPredicate = [NSPredicate predicateWithFormat:@"author IN %@ && genre IN %@",authorArrayController.selectedObjects,genreArrayController.selectedObjects];`

哎呀,我在玩弄各种不同的例子来尽可能简单地解释问题,结果却不一致了。我应该更清楚一些——我知道我必须应用一个谓词来过滤数组控制器,但我不确定如何在IB中设置这种关系,是否可能,或者我是否必须退而求其次写一些粘合剂来把它们联系起来? - Scott
我认为你必须使用代码,因为我没有看到任何从两个数组控制器中提取信息的方法可以放在过滤谓词框中。 - gerry3
我早就有所怀疑,但苹果文档中的参考让我产生了困惑!那看起来很棒,谢谢。 - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接