Cocoa iTunes风格的源代码列表如何通过绑定实现;可可粉中的CoreData?

Cocoa iTunes风格的源代码列表如何通过绑定实现;可可粉中的CoreData?,cocoa,core-data,cocoa-bindings,Cocoa,Core Data,Cocoa Bindings,举个例子,我当时正在用Cocoa编写一个iTunes克隆应用程序,由CoreData支持。为了简化起见,假设有两个“部分”,“库”包含音乐、电影、广播等内容,第二个部分称为“播放列表”,其中包含用户生成的播放列表(只是哑列表,而不是智能播放列表) 因此,SourceList本身通常使用NSOutlineView来实现,这通常很简单 源列表的Library部分实际上并不包含用户生成的任何内容,只包含应用程序的“功能”(本质上),其中Playlists部分仅包含用户创建的自定义列表。如何使用绑定和C

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

因此,SourceList本身通常使用
NSOutlineView
来实现,这通常很简单

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


总的来说,我的脚还是被绑定和应用程序包弄湿了,所以请容忍我。我感谢你的帮助。我应该补充一点,我的目标是10.6及以上版本。

由于本例中的源列表实际上是一个“范围”,而不是一个只包含一些“LibraryItem”实体实例的平面列表,因此我认为采用“老式”方式(即表数据源协议)更容易实现

这使您能够精确地控制分组、如何/何时将“静态”项目(如“库”和“音乐”、“电影”、“播放列表”)与商店中的项目(如“播放列表”部分下的单个播放列表项目)混合


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

我对核心数据没有太多经验,但我已经广泛使用了Cocoa的绑定。根据我的经验,类似这样的东西在对象的中间
NSArray
中效果最好,它是“手动”调整的

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

下面是一个快速的模型:

控制器.h

控制器.m


这是我认为需要做的事情。那么
setUserPlaylists
会是绑定调用的方法吗?当谈到绑定如何工作时,我非常迷茫(我知道它们与KVC的关系,但它们如何实际配置阵列/树控制器仍然让我困惑)。Cocoa负责幕后的所有绑定魔法。您所要做的就是定义一个满足KVO/KVC的属性。您@synthesis的任何属性都将满足该要求,并且每当您使用[self-setSomePropertyName:someValue]时,都会发送相应的KVC消息。拦截属性设置器(如我上面所示)是完全合法的。我不确定用户播放列表的数据源是什么(我想是CoreData中的数据),但如果将其绑定到控制器,则每当修改该列表时,控制器将收到一条
setUserPlaylists:
消息。
@interface TheController : NSObject
{
    NSArray * combinedArray;
    NSArray * userPlaylists;
}
@property (retain) NSArray * combinedArray;
@property (copy) NSArray * userPlaylists;
@end
@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