NSTableView 绑定和 tableViewSelectionDidChange

Posted

技术标签:

【中文标题】NSTableView 绑定和 tableViewSelectionDidChange【英文标题】:NSTableView bindings and tableViewSelectionDidChange 【发布时间】:2015-11-25 06:07:46 【问题描述】:

我有一个带有绑定的 NSTableView 设置,并且我已将委托+数据源设置为文件的所有者。表视图的元素不会触发委托方法。如果我在元素外部单击,即调用表格视图背景 - selectionShouldChangeInTableView

我不明白为什么不调用tableViewSelectionDidChange。说真的,为什么调试这么难?

-(void)tableViewSelectionDidChange:(NSNotification *)notification 
    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSTableView *tableView = [notification object];
    [[NSNotificationCenter defaultCenter] postNotificationName:TABLE_SELECTION object:tableView];



- (BOOL)selectionShouldChangeInTableView:(NSTableView *)tableView 
    NSLog(@"Hello there");
    return YES;

【问题讨论】:

显示方法的实现,或者至少显示方法头。 更新了问题。 selectionShouldChangeInTableView 是否总是返回 YES? @Willeke 是的。这正是我的观点,难道没有任何响应者链的痕迹或可以遵循的事件吗?我敢打赌这不会是最后一次调试这个 您是否专门将 NSTableView 的 delegate 连接连接到具有委托方法的控制器? 【参考方案1】:

如果你对选中的行感兴趣,可以使用委托方法

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex

但是更好的方法是在选择阵列控制器本身时添加一个观察者,您的表绑定到的阵列控制器

[myArrayController addObserver:self forKeyPath:@"selection" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

并使用以下方法监听更改:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSString *,
                                        id> *)change
                       context:(void *)context

别忘了在析构方法中移除观察者

-(void)dealloc 

    [super dealloc];
    [myArrayController removeObserver:self];

【讨论】:

以上是关于NSTableView 绑定和 tableViewSelectionDidChange的主要内容,如果未能解决你的问题,请参考以下文章

放弃 NSTableView 行为

NSTableView 透明TableView

Swift NSTableView, NSFileManager, 试图将文件名加载到 TableView 中,并且遇到选项问题

NSTableView 绑定和 tableViewSelectionDidChange

使用没有 nib 的 NSTableView 创建 NSScrollView — TableView 上缺少约束

使用乘法 NSArrayControllers 和 NSTableView 绑定数据