我目前正在阅读 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
我想确保我完全理解这里发生了什么。为了做到这一点,我有几个问题。
看起来该
numberOfRowsInTableView:
方法是在该方法之后自动调用的init
。这个对吗?多久接到
objectValueForTableColumn:
一次电话?什么事件促使该方法被调用?此外,在那里的代码中,该return
声明使我感到困惑。这个返回值到底去哪儿了?作为旁注,他们希望我通过控制+单击(通过连接面板)连接 Outlets 和 AppController 并以这种方式链接它们。有哪些替代方法可以在不这样做的情况下将代表和数据源连接到不同类型的视图?我假设添加
NSTableViewDelegate
控制器头文件可能是一种方法。如果您可以选择控制+单击将所有视图连接到插座等等,而不是以编程方式将其全部设置好,这只是一个偏好问题吗?在我看来,为了理解发生了什么,最好自己编写代码。