2013-04-25 1 views
2

Я пытаюсь лучше понять привязки какао. Я могу получить базовую таблицу, работающую с NSArrayController в IB-компоновщике. Я использую тот же проект и пытаюсь подключить привязки программно, однако строки не появляются.Программно связать NSTableView

Это мой файл заголовка

@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; 
} 

Любые предложения о том, какой шаг я пропускаю?

+0

Эй, добро пожаловать в СО! – paulmelnikow

ответ

3

Спасибо Noa ArrayController содержание было ноль, затем я наткнулся на этот раздел Automatically Prepares Content flag, также прислушался к вашим стилистическим точкам и изменил свой awakeFromNib на следующее ... все, кажется, работает, спасибо.

- (void)awakeFromNib 
{ 
    [self setAccountArrayController:[[NSArrayController alloc] init]]; 

    [[self accountArrayController] setManagedObjectContext:[self gdcManagedObjectContext]]; 
    [[self accountArrayController] setEntityName:@"Account"]; 

    NSError *error = nil; 
    BOOL success = [[self accountArrayController] fetchWithRequest:nil merge:NO error:&error]; 
    if (success) { 
     [[self accountTable] bind:NSContentBinding toObject:[self accountArrayController] withKeyPath:@"arrangedObjects" options:nil]; 

     [[self accountTable] bind:NSSelectionIndexesBinding toObject:[self accountArrayController] withKeyPath:@"selectionIndexes" options:nil]; 
    } else { 
     NSLog(@"Error %@:", [error localizedDescription]); 
    } 
} 
+0

У меня это работает так. Нет, мне интересно, какие объекты, содержащиеся в arrayController, должны поддерживать/соответствовать. У меня есть 'NSManagedObject' там, и tableView отображает строки, но не отображает значения ... –

3

Простые вещи: убедитесь, что -awakeFromNib называется ровно один раз, и что _gdcManagedObjectContext и accountTable не являются нулями в то время.

Попробуйте добавить статическую метку или цвет фона на ваш взгляд, так что вы можете подтвердить, что проблема ни одной строки (против строк с невидимым содержанием).

Когда вы подтверждаете проблему, нет строк, вы можете сделать вывод, что в -awakeFromNib есть проблема. Попробуйте добавить распечатки вашего контроллера массива arrangedObjects. Вероятно, он пуст. Ваш код в -tableView:viewForTableColumn:row в теории еще не вызывается. Вы можете подтвердить это с помощью точки останова или NSLog.

Если это так, проверьте, где вы устанавливаете стек Core Data. Вы используете NSPersistentDocument? Я столкнулся с проблемой, когда цикл цикла должен запускаться один раз, прежде чем контекст управляемых объектов начнет работать, но мне нужно будет подумать, не проблема ли вы здесь.

Существует проблема с кодом в -tableView:viewForTableColumn:row, который заключается в том, что вы потенциально настраиваете привязку снова и снова. Вы должны просто сделать это один раз для каждого экземпляра ячейки. Даже если вы хотите настроить контроллер массива в коде, я бы предположил, что вы рассматриваете привязку подсмотров сотового ящика в nib, так как там все в порядке. Или, если вы делаете это в коде, вам нужно найти способ сделать это только один раз за просмотр. Я не думаю, что это вызывает вашу проблему.

Стилистические пункты: в вашем коде используйте self.accountArrayController и self.gdcManagedObjectContext вместо _accountArrayController и _gdcManagedObjectContext. Кроме того, вы можете использовать константы для других типов привязки: NSContentBinding и NSSelectionIndexesBinding.