gpt4 book ai didi

objective-c - objectValueForTableColumn : get called? 何时出现

转载 作者:行者123 更新时间:2023-12-03 17:05:11 24 4
gpt4 key购买 nike

我目前正在阅读由 Big Nerd Ranch 提供的 Mac OSX Cocoa 书的第三版,并且我正在编辑我的程序以包含表格 View 。这里是 AppController.m 文件中的代码,我必须在其中实现 TableView 所需的协议(protocol)方法:

-(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] Getting number of rows in table view: 24
2012-05-27 15:02:29.042 Speakline[42836:f03] row selected 2
2012-05-27 15:02:29.043 Speakline[42836:f03] new voice com.apple.speech.synthesis.voice.Alex 2012-05-27 15:02:29.162 Speakline[42836:f03] Voice Name Agnes
2012-05-27 15:02:29.163 Speakline[42836:f03] Voice Name Albert

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

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

  2. objectValueForTableColumn: 多久被调用一次?什么事件促使该方法被调用?另外,在代码中,return 语句让我很困惑。这个返回值到底去了哪里呢?

  3. 附带说明一下,他们希望我通过 Control+单击(通过连接面板)来连接 Outlet 和 AppController,并以这种方式链接它们。如果不这样做,有什么替代方案可以将委托(delegate)和数据源连接到不同类型的 View ?我假设在 Controller 头文件中添加 NSTableViewDelegate 可能是一种方法。如果您可以选择控制+单击将所有 View 连接到 socket 等,而不是以编程方式进行全部设置,此时这只是一个偏好问题吗?在我看来,为了理解正在发生的事情,最好自己编写代码。

最佳答案

1) numberOfRowsInTableView 和 objectValueForTableColumn:Row: 在 Nib 取消归档后不久就会被调用(我不确定事情的确切顺序),因此 TableView 可以填充数据。

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

3) 连接委托(delegate)的另一种方法是使用 setDelegate: 在代码中执行此操作,但将 NSTableViewDelegate 放入 .h 文件中并不能做到这一点 - 这只是向编译器 promise 您将实现部分或全部代表消息。

关于objective-c - objectValueForTableColumn : get called? 何时出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10776932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com