我目前正在阅读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
我想确保我完全理解这里发生了什么。为了做到这一点,我有几个问题。
看起来在numberOfRowsInTableView:
方法后自动调用了init
方法。这是对的吗?
objectValueForTableColumn:
多久被调用一次?什么事件提示该方法被调用?此外,在那里的代码中,return
语句使我感到困惑。这个回报值到底在哪里?
作为旁注,他们希望我通过控制+点击(通过连接面板)连接Outlets和AppController,并以这种方式链接它们。如果没有这样做,有什么替代方案可以将代理和数据源连接到不同类型的视图?我假设在控制器头文件中添加NSTableViewDelegate
可能是一种方式。如果您可以选择控制+点击将所有视图连接到出口等等,那么以编程方式设置它只是在这一点上的优先选择?在我看来,为了理解发生了什么,自己编写代码可能会更好。
答案 0 :(得分:2)
1)numberOfRowsInTableView和objectValueForTableColumn:Row:在nib被取消归档后很快就被调用(我不确定事物的确切顺序),因此表视图可以填充数据。
2)加载表并重新加载或添加新数据以及滚动将导致调用objectValueForTableColumn:row:(通过表视图)。它会被填充的每一行调用。该值将转到表视图,即它获取数据的方式。
3)连接委托的另一种方法是使用setDelegate:在代码中执行此操作,但是在.h文件中放置NSTableViewDelegate不会这样做 - 这只是对编译器的承诺,您将实现部分或全部代表信息。