2014-02-19 60 views
0

我有一個帶有NSTableView,複選框和標籤的窗口。這三個項目都連接到一個NSWindowController子類我命名PrefWindowController:NSTableView在窗口加載後爲零

@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並用它來設置對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是零。當我們通過windowDidLoad調用updateTable時,並不是零,所以我知道它有一個合適的'Reference Outlet'(至少,我敢肯定 - 我對IB中的「Object」的區別和「文件所有者」)。但是我不知道它會是零,但其他兩個不會。

+0

我想我有一個想法是怎麼回事。你能否用這些元素添加IB的屏幕截圖? – Dumoko

+0

這是你需要的嗎? http://imgur.com/uLwfczd –

+0

我看到tableView就像View層次結構中的一個單獨的節點。這意味着,因爲tableView充當一種根,它應該自己處理它自己的內存,所以請嘗試將weak設置爲tableView的強引用。 – Dumoko

回答

0

而不是windowDidLoad使用awakeFromNib來做那個處理。我認爲windowDidLoad是在所有插座連線之前調用的。

+0

在windowDidLoad中,所有插座都已連線(至少目前爲止已經是這種情況)。但是,當通知觸發(稍後,與windowDidLoad事件無關)時,插座未連線。 –