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

标签 objective-c cocoa nstableview

我目前正在阅读由 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/

相关文章:

ios - 旋转呈现 View 并锁定呈现 View Controller 的方向

iphone - UITableViewCell,删除按钮框架?

swift - 使用 swift 用 NSPopupButtonCell 填充 NSTableView 行

objective-c - 如何改变 NSTableView 滚动条的外观

cocoa - 使用按键从表格 View 中删除条目

objective-c - Objective-C 中的插入符号

objective-c - 在 Objective-C 框架中导入 Swift 类

c - 如何从 Swift 调用 dispatch_benchmark

objective-c - if() 中的字符串比较遵循错误的分支

cocoa - NSTableView的documentView大小观察