2009-06-21 8 views
-4

私は働くためにNSArrayにアクセスする必要があるいくつかのコードを持っています。私はコアデータで使用しているNSArrayを持っており、その中にデータを持ちますが、NSArrayControllerをNSArrayにアクセスさせる方法が不明です。Core DataでNSArrayとNSArrayControllerを使用するにはどうすればよいですか?

ヘッダーファイルで次のように宣言することはできません。NSArray *objectArray;アクセス方法や方法がわからないためです。 Core Dataで使用しているNSArrayにどのくらい正確にアクセスできますか?

私のヘッダーファイル:

#import <Cocoa/Cocoa.h> 


@interface MyOutlineView : NSOutlineView { 
    NSArrayController* objectArray; 
} 

@end 

私の実装ファイル:

#import "MyOutlineView.h" 

@implementation MyOutlineView 

- (void) outlineView: (NSOutlineView *) aView 
    willDisplayCell: (id) aCell 
     forTableColumn: (NSTableColumn *)aColumn 
       item: (id) anItem 
{ 
    id rootObj = anItem; 
    unsigned row = [aView rowForItem:anItem]; 

    [aCell setDrawsBackground: YES]; 

    while ([aView levelForRow:row] != 0) { 
     row --; 
     rootObj = [aView itemAtRow:row]; 
    } 

    // The colours here are foul and ugly. Use something else, for 
    // God's sake! 
    if([objectArray indexOfObject:rootObj] % 2) 
     [aCell setBackgroundColor: [NSColor yellowColor]]; 
    else 
     [aCell setBackgroundColor: [NSColor blueColor]]; 
} 

@end 
+0

どのようにコアデータでNSArrayを使用していますか?コアデータオブジェクトをNSArrayオブジェクトにフェッチしますか? – diederikh

+0

アウトラインビューにあるテキストを格納するためにNSArrayを使用しています。アウトラインビューのルートオブジェクトに異なる背景色を付けるいくつかのコードがあります。しかし、どのオブジェクトがルートオブジェクトであるかを知るためにNSArrayにアクセスする必要があります。 – Joshua

+0

NSArrayは現在どのオブジェクトに保持されていますか? NSArrayを制御するNib内にNSArrayControllerがありますか?これは、他のオブジェクトがNSArrayControllerにバインドするこの方法で意味をなさないかもしれません。 – diederikh

答えて

0

私はXIBからNSArrayControllerはに接続IBOutletとテストアプリを作りました。このテストで私は持っています:

  • コアデータアプリケーションテンプレートから開始しました。
  • created 2つの属性(文字列、int)を持つデータモデルのエンティティ。
  • XIBで

:Test_AppDelegate.managedObjectContextに接続された管理オブジェクトコンテキストと

  • アレイコントローラ。
  • TableViewで、配列コントローラの第1および第2の属性である配列オブジェクトにcolsが接続されています。
  • アレイコントローラのadd:およびremove:actionsに接続されているAddおよびRemoveボタン。
  • ボタン「表示回数」とラベル。 - コードに

(Test_AppDelegate *):

  • IBOutlet NSArrayControllerは* AC。 (Test_AppDelegate.acからXibでArray Controllerに接続)。
  • IBOutlet NSTextField * nLabel; (ラベルにXibで接続)。
  • (IBAction)showNum:(id)送信者。 (「表示回数」ボタンから接続)。
  • 動作中のコードshowNum: [nLabel setIntValue:[[ac arrangedObjects] count]];

私がすることができるよ:

  • は、テーブルビューおよび制御配列にオブジェクトを追加/削除。
  • コードからNSArrayControllerにアクセスして、配列の配列を取得します。

したがって、IBOutletをコードからXibのアレイコントローラにバインドし、その配置されたオブジェクトにアクセスする必要があります。

+0

私はIBOutletを使ってobjectArrayを宣言し、それをNSArrayControllerにリンクしようとしました。しかし、if([objectArray indexOfObject:rootObj]%2) 'という行の'バイナリ%へのオペランドが無効です 'というエラーが表示されるのは、配列コントローラではない配列を探しているからです。どうすればこの問題を解決できますか?私はまた、私が使用しているすべてのコードで最初の投稿を更新しました。 – Joshua

+0

私はセレクタを作成する必要があるというコードがどこから得られたかを読みます。これは彼らが言ったことです。自己がセレクタ-objectArrayに応答すると仮定すると、アウトラインビューに表示されたトップレベルオブジェクトの配列が正しい順序で返されます。 – Joshua

+0

NSArrayControllerはオブジェクトの配列のコントローラーであり、配列自体のコントローラーではないことを明確に理解する必要があります。したがって、このコントローラーからオブジェクトにアクセスするには、 'arrangeObjects:を使用して配列されたレシーバーのコンテンツオブジェクトを含む配列を返します'という配列オブジェクトプロパティを使用する必要があります(Appleのドキュメントから)。これらのオブジェクトは、配列コントローラのソータとフィルタに準拠して配置され、一連の結果管理オブジェクト(NSManagedObject)として表されます。各オブジェクトには、valueForKey:メソッドを使用してキーでアクセスできるデータモデルで記述された値が含まれています。 – Anton

0

私はこれを取得していないかもしれませんが、initWithArrayメソッドを作成するだけではできませんか?

+0

これは答えとして何が間違っていましたか? – Grouchal

+0

私に例を教えてください。 – Joshua

+0

MyOulineViewはどこで作成しますか?コードで行いますか?そうであれば、initを使用してinitをオーバーライドする代わりに、NSArrayをクラスに追加します。 – Grouchal

関連する問題