让我们说,为了说明,我在Cocoa中编写了一个iTunes克隆应用程序,该应用程序由CoreData支持。为简化起见,假设有两个“部分”,“图书馆”,包括音乐,电影,广播等。第二部分称为“播放列表”,其中包含用户生成的播放列表(只是哑列表,而不是智能播放列表)
所以SourceList本身通常会用NSOutlineView
实现,这通常很简单。
源列表的“库”部分并不真正包含用户生成的任何内容,只包含应用程序的“功能”(实质上),其中“播放列表”部分仅包含用户创建的自定义列表。如何用Bindings和CoreData做到这一点?是否可以将播放列表部分绑定到用户的数据并具有显示库功能的自定义方式?
我一般都会使用Bindings和AppKit弄湿我的脚,所以请耐心等待。我很感激帮助。我应该补充一点,我的目标是10.6及以上。
答案 0 :(得分:6)
我对核心数据没有太多经验,但我已经广泛使用了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
答案 1 :(得分:1)
由于这种情况下的源列表实际上是一个“范围”而不是除了某些“LibraryItem”实体的实例之外的平面列表,我认为以“老式”方式(即表数据)实现这一点更容易源协议)。
这使您可以精确控制分组,如何/何时将“静态”项目(如“图书馆”和“音乐”,“电影”,“播放列表”)与商店中的项目混合(如个别播放列表项目)在“播放列表”部分下。)
在我看来,处理拖放操作也更容易一些,这是阻止播放列表项目被放到“电影”组中的关键。