如何在 Cocoa 中使用 Bindings+CoreData 实现 iTunes 样式的 Source-List?

Posted

技术标签:

【中文标题】如何在 Cocoa 中使用 Bindings+CoreData 实现 iTunes 样式的 Source-List?【英文标题】:How would an iTunes-style Source-List be implemented with Bindings+CoreData in Cocoa? 【发布时间】:2009-11-04 21:58:12 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

这是一个快速的模型:

TheController.h

@interface TheController : NSObject

    NSArray * combinedArray;
    NSArray * userPlaylists;

@property (retain) NSArray * combinedArray;
@property (copy) NSArray * userPlaylists;
@end

TheController.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

【讨论】:

这是我认为需要做的事情。那么setUserPlaylists 会是 Bindings 调用的方法吗?当谈到绑定的工作方式时,我非常迷茫(我知道它们与 KVC 的关系,但它们实际上是如何使用 Array/Tree 控制器配置的仍然让我感到困惑)。 是的。 Cocoa 负责幕后的所有绑定魔法。您所要做的就是定义一个满足 KVO/KVC 的属性。您@synthesize 的任何属性都将满足该要求,并且任何时候您使用 [self setSomePropertyName:someValue],都会发送相应的 KVC 消息。拦截属性设置器(如上所示)是完全合法的。我不确定您的用户播放列表的数据源是什么(我猜是来自 CoreData),但如果您将其绑定到控制器,只要该列表被修改,控制器就会收到 setUserPlaylists: 消息。【参考方案2】:

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

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

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

【讨论】:

以上是关于如何在 Cocoa 中使用 Bindings+CoreData 实现 iTunes 样式的 Source-List?的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa - 绑定 - Tableview - 如何计算列的总和

ArrayController 找不到 AppDelegate(Cocoa 中的绑定)

核心数据教程 [关闭]

CH3COCoA是啥

java bindings - 如何在不获取-0.0值的情况下将float绑定到jtable?

如何使用 javafx.beans.binding.Bindings.select(...) 进行简洁的值绑定