1

我目前正在阅读 Big Nerd Ranch 家伙的 Mac OSX Cocoa 书的第 3 版,并且我正在编辑我的程序以包含表格视图。这里是 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控制器头文件可能是一种方法。如果您可以选择控制+单击将所有视图连接到插座等等,而不是以编程方式将其全部设置好,这只是一个偏好问题吗?在我看来,为了理解发生了什么,最好自己编写代码。

4

1 回答 1

2

1) numberOfRowsInTableView 和 objectValueForTableColumn:Row: 在 nib 未归档后立即调用(我不确定事情的确切顺序),因此可以用数据填充表格视图。

2)表的加载和重新加载或添加新数据以及滚动将导致 objectValueForTableColumn:row: 被调用(由表视图)。它会为填充的每一行调用。该值进入表视图,这就是它获取数据的方式。

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

于 2012-05-27T23:13:45.763 回答