窗口加载后NSTableView为零

时间:2014-02-19 14:30:50

标签: cocoa nstableview

我有一个带有NSTableView的窗口,一个复选框和一个标签。这三个项目连接到一个名为PrefWindowController的NSWindowController子类:

@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上设置DataSource:

-(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),如果发生更新,它会发送一个Notification,听取:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(updateTable:)
                                       name:@"ethernetStatusChanged"
                                       object:nil];

问题是当通知触发时,我们进入updateTable,enabledCheckbox是一个有效指针,powerConnectedLabel是一个有效指针,但 ethernetAdaptorsTable是nil 。当我们通过windowDidLoad调用updateTable时,它并没有结果,所以我知道它有一个合适的参考插座' (至少,我非常确定 - 我在"对象"在IB和"文件的所有者")之间有点混淆。但我不知道,虽然它会是零,但其他两个不会。

2 个答案:

答案 0 :(得分:0)

而不是windowDidLoad使用awakeFromNib来做那个处理。我认为windowDidLoad在所有出口连接之前被调用。

答案 1 :(得分:0)

我遇到的问题基本上是我将一些东西连接到File的所有者,其他东西连接到NSObject,它本身就是与FileOwner相同的类。这个课程有两个实例漂浮在周围,而我正在不同的那些实例上结束。

我通过覆盖和破坏Init函数来调试它。我还提到了这个问题,它实际上存在同样的问题:Instance variables lose value after initWithNib and before IBAction in NSViewController