7

例として、私が Cocoa で iTunes クローン アプリを作成していたとしましょう。これは CoreData に支えられています。簡単にするために、音楽、映画、ラジオなどを含む「ライブラリ」という 2 つの「セクション」があるとします。そして、ユーザーが生成したプレイリスト (スマート プレイリストではなく単なるダム リスト) を保持する「プレイリスト」と呼ばれる 2 つ目のセクションがあります。 .

したがって、SourceList 自体は通常、 で実装されます。これNSOutlineViewは一般的に簡単です。

ソース リストのライブラリ セクションには、実際にはユーザーが生成したものは何も格納されず、(本質的に) アプリの "機能" のみが格納されます。プレイリスト セクションには、ユーザーが作成したカスタム リストのみが格納されます。Bindings と CoreData を使用してこれを行うにはどうすればよいでしょうか? プレイリスト セクションをユーザーのデータにバインドし、ライブラリ機能を表示する独自の方法を持つことは可能ですか?

Bindings と AppKit 全般についてはまだ慣れていないので、ご容赦ください。助けてくれてありがとう。追加する必要がありますが、10.6 以降をターゲットにしています。

4

2 に答える 2

6

私はコア データを扱った経験はあまりありませんが、Cocoa のバインディングを多用してきました。NSArray私の経験では、このようなものは、「手動で」調整されたオブジェクトの中間で最もうまく機能します。

NSArray例として、ユーザーが作成したプレイリストのカスタムがありNSArray、標準のライブラリ アイテムを含む別のプレイリストもあるとします。このセットアップでは、コントローラの 1 つに というプロパティを作成します。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
于 2009-11-04T22:48:53.680 に答える
1

この場合のソース リストは実際には「スコープ」であり、「LibraryItem」エンティティのインスタンスだけのフラットなリストではないため、これを「昔ながらの」方法 (つまり、テーブル データ ソース プロトコル) で実装する方が簡単だと思います。 .

これにより、グループ化、「静的」アイテム (「ライブラリ」、「音楽」、「映画」、「プレイリスト」など) をストアのアイテム (「プレイリスト」セクション)。

私の意見では、ドラッグ アンド ドロップを処理するのも少し簡単です。これは、Playlist アイテムが "Movies" グループにドロップされるのを防ぐときに重要です。

于 2009-11-04T22:06:23.093 に答える