2014-02-19 2 views
0

У меня есть окно с 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 и «Владелец файла»). Но я не знаю, пока это будет ноль, но два других не будут.

+0

Я думаю, что у меня есть идея, что происходит. Не могли бы вы добавить скриншот IB с этими элементами? – Dumoko

+0

Это то, что вам нужно? http://imgur.com/uLwfczd –

+0

Я вижу, что tableView выглядит как отдельный узел в иерархии View. Это означает, что поскольку tableView действует как своего рода корень, он должен сам по себе заботиться о собственной памяти, поэтому попробуйте установить слабый в сильную ссылку для tableView. – Dumoko

ответ

0

Вместо windowDidLoad используйте awakeFromNib для выполнения этой обработки. Я думаю, что windowDidLoad вызывается до того, как все розетки подключены.

+0

В окне WindowDidLoad все розетки подключены (по крайней мере, это было до сих пор.) Но когда срабатывает уведомление (позднее, не связанное с событием windowDidLoad), розетка не подключена. –

0

Проблема, с которой я столкнулась, состояла в том, что у меня были некоторые вещи, подключенные к Владельцу Файла, и другие вещи, подключенные к NSObject, который был тем же самым классом, что и FileOwner. Было два случая, когда этот класс плавал вокруг, и я обманывал их.

Я отлаживал его, переопределяя и прерывая функции Init. Я также ссылался на этот вопрос, который имел практически ту же проблему: Instance variables lose value after initWithNib and before IBAction in NSViewController

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