代码之家  ›  专栏  ›  技术社区  ›  jbrennan

如何使用cocoa中的bindings+coredata实现iTunes风格的源列表?

  •  7
  • jbrennan  · 技术社区  · 15 年前

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

    因此,源列表本身通常使用 NSOutlineView 一般来说,这很简单。

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

    总的来说,绑定和AppKit仍然让我的脚湿透了,所以请你忍受我。我感谢你的帮助。我应该补充一下,我的目标是10.6及以上。

    2 回复  |  直到 15 年前
        1
  •  6
  •   James Eichele Bernard Igiri    15 年前

    我在核心数据方面没有太多的经验,但是我已经广泛地使用了cocoa的绑定。根据我的经验,像这样的东西最适合中间人 NSArray “手动”调整的对象。

    举个例子,我想你会有一个习惯 不可变数组 由用户生成的播放列表,您还可以 不可变数组 包含标准库项。使用这个设置,我将在您的一个控制器中创建一个名为 combinedArray ,这将是绑定到您的 NSOutlineView . 然后,我将您的用户生成的播放列表数组绑定到控制器上,并在控制器中的一些代码在修改播放列表数组时自动更新组合的数组。

    下面是一个快速模型:

    控制者H

    @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
    
        2
  •  1
  •   Joshua Nozzi    15 年前

    由于本例中的源列表实际上是一个“范围”,而不是一个只包含某些“libraryitem”实体实例的简单列表,因此我认为用“老式”方法(即表数据源协议)更容易实现这一点。

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

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