2

私はココアバインディングをよりよく理解しようとしています. IBビルダーでNSArrayControllerと連携する基本的なテーブルを取得できます。同じプロジェクトを使用して、バインディングをプログラムで接続しようとしていますが、行が表示されません。

これは私のヘッダーファイルです

@interface SBGoalDetailController : NSViewController <NSTableViewDelegate, NSTableViewDataSource>

@property (nonatomic, strong) NSManagedObjectContext *gdcManagedObjectContext;
@property (nonatomic, strong) NSArrayController *accountArrayController;
@property (weak) IBOutlet NSTableView *accountTable;


- (id)initWithContext:(NSManagedObjectContext *)context;

そして私の実装ファイル

@implementation SBGoalDetailController

- (id)initWithContext:(NSManagedObjectContext *)context
{
    self = [super initWithNibName:@"GoalDetailView" bundle:nil];
    if (self) {
        [self setGdcManagedObjectContext:context];
    }
    return self;
}



- (void)awakeFromNib
{
    _accountArrayController = [[NSArrayController alloc] init];

    [[self accountArrayController] setManagedObjectContext:_gdcManagedObjectContext];
    [[self accountArrayController] setEntityName:@"Account"];
    [[self accountArrayController] setAutomaticallyPreparesContent:YES];
    [[self accountTable] bind:@"content" toObject:_accountArrayController withKeyPath:@"arrangedObjects" options:nil];

    [[self accountTable] bind:@"selectionIndexes" toObject:_accountArrayController withKeyPath:@"selectionIndexes" options:nil];
}


- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

    NSView *returnView = [tableView makeViewWithIdentifier:@"AccountCell" owner:[tableView delegate]];

        NSTextField* textField = [[returnView subviews] objectAtIndex: 0];

    [textField bind: NSValueBinding
           toObject: returnView
        withKeyPath: @"objectValue.accountName"
            options: nil];

    return returnView;
}

私が見逃しているステップについて何か提案はありますか?

4

2 に答える 2

3

まず簡単なこと: が-awakeFromNib1 回だけ呼び出さ れ、その時点で_gdcManagedObjectContextaccountTableが非 nil であることを確認します。

ビューに静的なラベルまたは背景色を追加してみて、問題が行がないこと(vs.非表示のコンテンツを含む行)であることを確認できるようにします。

問題が行がないことを確認したら、 に問題があると結論付けることができます-awakeFromNib。アレイ コントローラの のプリントアウトを追加してみてくださいarrangedObjects。おそらく空です。理論上のコードは-tableView:viewForTableColumn:rowまだ呼び出されていません。ブレークポイントまたは NSLog で確認できます。

その場合は、Core Data スタックをセットアップしている場所を確認してください。NSPersistentDocument を使用していますか? 管理対象オブジェクト コンテキストが機能し始める前に、実行ループを 1 回実行する必要があるという問題が発生しましたが、それがここに表示されている問題かどうかを考えなければなりません。

のコードには問題があり-tableView:viewForTableColumn:row、バインディングを何度も設定している可能性があります。これは、セル ビューのインスタンスごとに 1 回だけ行う必要があります。配列コントローラーをコードで設定したい場合でも、セル ビューのサブビューを nib にバインドすることを検討することをお勧めします。または、コードで行う場合は、ビューごとに 1 回だけ行う方法を見つける必要があります。しかし、それがあなたの問題を引き起こしているとは思いません。

スタイル上のポイント: コードでは、self.accountArrayControllerandself.gdcManagedObjectContextの代わりに_accountArrayControllerand を使用します_gdcManagedObjectContext。また、他のバインディング タイプに定数を使用することもできます:NSContentBindingおよびNSSelectionIndexesBinding.

于 2013-04-25T21:05:20.173 に答える