7

假设,为了说明,我正在用 Cocoa 编写一个由 CoreData 支持的 iTunes 克隆应用程序。为简化起见,假设有两个“部分”,“库”包含音乐、电影、广播等内容。第二个部分称为“播放列表”,其中包含用户生成的播放列表(只是哑列表,不是智能播放列表) .

所以 SourceList 本身通常会用 来实现NSOutlineView,这通常很简单。

源列表的库部分实际上并没有包含用户生成的任何内容,只有应用程序的“功能”(本质上),其中播放列表部分仅包含用户创建的自定义列表。如何使用 Bindings 和 CoreData 做到这一点?是否可以仅将播放列表部分绑定到用户数据并具有显示库功能的自定义方式?

总的来说,我仍然对 Bindings 和 AppKit 感到困惑,所以请多多包涵。我很感激帮助。我应该补充一点,我的目标是 10.6 及更高版本。

4

2 回答 2

6

我对核心数据没有太多经验,但我已经广泛使用了 Cocoa 的绑定。以我的经验,这样的东西最适合“手动”调整的中间NSArray对象。

作为一个例子,我想你会有一个自定义NSArray的用户生成的播放列表,你也会有一个单独NSArray的包含你的标准库项目。通过此设置,我将在您的一个名为 的控制器中创建一个属性combinedArray,该属性将绑定到您的NSOutlineView. 然后,我会将您的用户生成的播放列表数组绑定到控制器,并让控制器中的一些代码在播放列表数组被修改时自动更新组合数组。

这是一个快速的模型:

控制器.h

@interface TheController : NSObject
{
    NSArray * combinedArray;
    NSArray * userPlaylists;
}
@property (retain) NSArray * combinedArray;
@property (copy) NSArray * userPlaylists;
@end

控制器.m

@implementation TheController

@synthesize combinedArray;
@synthesize userPlaylists;
- (void)setUserPlaylists:(NSArray *)newLists
{
    // standard property setting code:
    if (newLists != userPlaylists)
    {
        [userPlaylists release];
        userPlaylists = [newLists copy];
    }

    // modify the combined array:
    NSMutableArray * allItems = [NSMutableArray arrayWithCapacity:0];
    [allItems addObjectsFromArray:standardLibrary];
    [allItems addObjectsFromArray:userPlaylists];
    [self setCombinedArray:allItems];
}

@end
于 2009-11-04T22:48:53.680 回答
1

由于这种情况下的源列表实际上是一个“范围”,而不是一个平面列表,只是一些“LibraryItem”实体的实例,我认为以“老式”方式(即表数据源协议)实现这一点更容易.

这使您可以精确控制分组、如何/何时将“静态”项目(如“图书馆”和“音乐”、“电影”、“播放列表”)与您商店中的项目(如“播放列表”部分)。

在我看来,处理拖放也更容易一些,这是防止播放列表项目被拖放到“电影”组中的关键。

于 2009-11-04T22:06:23.093 回答