objectValueForTableColumn:什么时候被调用?

时间:2012-05-27 20:15:39

标签: objective-c cocoa nstableview

我目前正在阅读Big Nerd Ranch的第三版Mac OSX可可书,我正在编辑我的程序以包含表格视图。这里是AppController.m文件中的代码,我必须从TableView实现所需的协议方法:

-(id)init{
    self = [super init];

    voiceArray = [NSSpeechSynthesizer availableVoices];
    speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
    [speechSynth setDelegate:self];
    return self;
}

-(int)numberOfRowsInTableView:(NSTableView *)tv{
    NSLog(@"Getting number of rows in table view: %lu", [voiceArray count]);
    return [voiceArray count];
}

-(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{

    NSString *v = [voiceArray objectAtIndex:row];
    NSDictionary *dict = [NSSpeechSynthesizer attributesForVoice:v];
    NSLog(@"Voice Name %@", [dict objectForKey:NSVoiceName]);
    return [dict objectForKey:NSVoiceName];
}

-(void)tableViewSelectionDidChange:(NSNotification *)notification{
    int row = [tableView selectedRow];
    NSLog(@"row selected %d", row);
    if(row == 1){
        return;
    }
    NSString *selectedVoice = [voiceArray objectAtIndex:row];
    [speechSynth setVoice:selectedVoice];
    NSLog(@"new voice %@ ", selectedVoice);
}

当应用程序首次加载时,我得到以下输出:

  

2012-05-27 15:02:29.040 Speakline [42836:f03]获取行数   表格视图:24
2012-05-27 15:02:29.042 Speakline [42836:f03]行   选择2
2012-05-27 15:02:29.043 Speakline [42836:f03]新声音   com.apple.speech.synthesis.voice.Alex 2012-05-27 15:02:29.162   Speakline [42836:f03]语音名称Agnes
2012-05-27 15:02:29.163   Speakline [42836:f03]语音名称Albert

我想确保我完全理解这里发生了什么。为了做到这一点,我有几个问题。

  1. 看起来在numberOfRowsInTableView:方法后自动调用了init方法。这是对的吗?

  2. objectValueForTableColumn:多久被调用一次?什么事件提示该方法被调用?此外,在那里的代码中,return语句使我感到困惑。这个回报值到底在哪里?

  3. 作为旁注,他们希望我通过控制+点击(通过连接面板)连接Outlets和AppController,并以这种方式链接它们。如果没有这样做,有什么替代方案可以将代理和数据源连接到不同类型的视图?我假设在控制器头文件中添加NSTableViewDelegate可能是一种方式。如果您可以选择控制+点击将所有视图连接到出口等等,那么以编程方式设置它只是在这一点上的优先选择?在我看来,为了理解发生了什么,自己编写代码可能会更好。

1 个答案:

答案 0 :(得分:2)

1)numberOfRowsInTableView和objectValueForTableColumn:Row:在nib被取消归档后很快就被调用(我不确定事物的确切顺序),因此表视图可以填充数据。

2)加载表并重新加载或添加新数据以及滚动将导致调用objectValueForTableColumn:row:(通过表视图)。它会被填充的每一行调用。该值将转到表视图,即它获取数据的方式。

3)连接委托的另一种方法是使用setDelegate:在代码中执行此操作,但是在.h文件中放置NSTableViewDelegate不会这样做 - 这只是对编译器的承诺,您将实现部分或全部代表信息。