2010-04-29 7 views
0

Я только что начал с XCode (v3.2.2) и Interface Builder и столкнулся с проблемой.Проблема с привязкой NSTableView

Вот что я сделал:

Я сделал класс быть DataSource из NSTableView:

@interface TimeObjectsDS : NSControl { 
    IBOutlet NSTableView * idTableView; 
    NSMutableArray * timeObjects; 
} 
@property (assign) NSMutableArray * timeObjects; 
@property (assign) NSTableView * idTableView; 

- (id) init; 
- (void) dealloc; 

- (void) addTimeObject: (TimeObj *)timeObject;  

// NSTableViewDataSource Protocol functions 
- (int)numberOfRowsInTableView:(NSTableView *)tableView; 
- (id)tableView:(NSTableView *)tableView 
      objectValueForTableColumn:(NSTableColumn *)tableColumn row: 
      (int)row; 


@implementation TimeObjectsDS 

@synthesize timeObjects; 
@synthesize idTableView; 

-(id) init {   
    if (self = [super init]) { 
     self.timeObjects = [[NSMutableArray alloc] init]; 

     TimeObj *timeObject = [[TimeObj alloc] init]; 
     [timeObject setProjectId:11]; 
     [timeObject setDescription:@"Heja"]; 
     [timeObject setRegDate:@"20100331"]; 
     [timeObject setTimeSum:20.0]; 

     [timeObjects addObject:timeObject];  

     [timeObject release]; 

     [idTableView reloadData];   
    } 

    return self; 
} 

- (void) dealloc { 
    [idTableView release]; 
    [timeObjects release]; 
    [super dealloc];   
} 
// Functions 
- (void) addTimeObject: (TimeObj *)timeObject { 
    [self.timeObjects addObject:timeObject]; 

    [idTableView reloadData];  
} 

// NSTableViewDataSource Protocol functions 
- (int) numberOfRowsInTableView:(NSTableView *)tableView { 

    return [self.timeObjects count]; 
} 

- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { 

    return [[timeObjects objectAtIndex:row] description]; 
} 
@end 

Я тогда связан мой NSTableView в представлении к этому источнику данных, как так:

alt text http://www.og-entertainment.com/tmp/ib_datasource_bindings_big.png

Я также связывал View NSTableView переменной контроллера idTableView в Interface Builder видели выше

В функции init я добавляю элемент в изменяемый массив. Это правильно отображается в NSTableView при запуске приложения. Однако, когда я добавляю еще один элемент в массив (того же типа, что и в init), и попробуйте вызвать [idTableView reloadData] в представлении ничего не происходит. Фактически контроллер idTableView имеет значение NULL. При печати переменной с NSLog (@ "idTableView:% @", idTableView) Я получаю "idTableView: (нуль)"

Im подножка из идей, как это исправить. Любые идеи о том, что я могу сделать, чтобы исправить привязку?

ответ

1

Если ваша настольная розетка в вашем контроллере пустая, вы не подключили ее в Interface Builder. Ваш скриншот выше показывает соединение с TimeObjectsDS, но это не означает многого - это тот экземпляр, который вы вызываете reloadData? Возможно, у вас есть, например, несколько экземпляров этого класса.

Это только одна возможность. Без кода больше не представляется возможным перечислить еще много.

Кстати, в MVC считается плохим подключением объекта модели непосредственно к представлению. Вы можете использовать терминологию неправильно.

+0

Большое спасибо за ваше время. Я добавил код реализации и исправил терминологию. У меня есть только один экземпляр TimeObjectDS, и я вызываю reloadData из него. –

+0

Откуда вы вызываете свой метод? (это не функция). Если он вызывается перед awakeFromNib, тогда tableView будет по-прежнему нулевым. Более нормально создавать свойства объекта в качестве сохранения, а не назначать, но ваш код не является неправильным как таковой. Вы также несовместимы в своем использовании себя. ссылаться на свойства, но опять же, код не ошибается, и многие люди делают то же самое. –

+0

Снова большое спасибо за ваше время. Я вызвал метод до awakeFromNib. –

Смежные вопросы