У меня есть окно с NSTableView, флажок и метка. Эти три элемента подключен к подклассу NSWindowController я назвал PrefWindowController:NSTableView nil после загрузки окна
@interface PrefWindowController : NSWindowController
//Members
@property (weak) IBOutlet NSButton *enabledCheckbox;
@property (weak) IBOutlet NSTextField *powerConnectedLabel;
@property (weak) IBOutlet NSTableView *ethernetAdaptorsTable;
@property (strong) EthernetAdaptorsDataSource* currentDatasource;
//Methods
-(IBAction)updateTable;
//...
//Overridden Methods
-(void) windowDidLoad;
@end
Я отменяю windowDidLoad и использовать его, чтобы установить DataSource на NSTableView:
-(void)windowDidLoad
{
[super windowDidLoad];
[self updateTable:nil];
}
-(void) updateTable:(NSNotification*)notification
{
self.currentDatasource = [[EthernetAdaptorsDataSource alloc] initWithData: [[AppState getState] ethernetAdaptors]];
[self.ethernetAdaptorsTable setDataSource:self.currentDatasource];
[self.ethernetAdaptorsTable reloadData];
}
У меня есть таймер, который в конечном итоге вызывает перезагрузку данных. Это немного запутанным, но конкретно таймер вызывает функцию (checkForUpdates) и, если происходит обновление, он посылает уведомление, которое прислушался:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(updateTable:)
name:@"ethernetStatusChanged"
object:nil];
Проблема в том случае, когда уведомление срабатывает, и мы входим в updateTable, enabledCheckbox - действительный указатель, а powerConnectedLabel - действительный указатель, но ethernetAdaptorsTable - это nil. Это было не ноль, когда мы вызвали updateTable через windowDidLoad, поэтому я знаю, что у него есть соответствующая «Reference Outlet» (по крайней мере, я уверен - я немного запутался между разницей «Объекта» в IB и «Владелец файла»). Но я не знаю, пока это будет ноль, но два других не будут.
Я думаю, что у меня есть идея, что происходит. Не могли бы вы добавить скриншот IB с этими элементами? – Dumoko
Это то, что вам нужно? http://imgur.com/uLwfczd –
Я вижу, что tableView выглядит как отдельный узел в иерархии View. Это означает, что поскольку tableView действует как своего рода корень, он должен сам по себе заботиться о собственной памяти, поэтому попробуйте установить слабый в сильную ссылку для tableView. – Dumoko