2014-02-19 24 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事件无关)时,插座未连线。 –