在基于单元格的NSTableView中检测单元格编辑的开始

时间:2014-04-17 15:43:27

标签: nstableview nsoutlineview nscell nstableviewcell

我在NSTableView中有一些可编辑的单元格。

我双击它进入一个单元格。我的窗户上还有其他按钮。每当我点击一个按钮时,这就会终止单元格编辑,这样我就不会在单元格中得到任何内容,并且即使我调用[myTableView reloadData]也不会刷新NSTableView。

一种可能的解决方法是在NSTableView开始进行单元格编辑后立即禁用所有按钮,但我不知道如何检测到这一点。

我可以在输入内容后立即捕获:

(void)controlTextDidBeginEditing:(NSNotification *)notification

但这不是我想要的,但为时已晚,因为只有在用户输入单元格编辑器后才会调用它。

我想确切地检测细胞编辑何时开始,即使还没有输入任何内容。

我看过一些有可能结果的帖子:

  

最好先要求窗口成为第一个响应者(因此   将firstReponder从焦点区域移开,如果失败,   在NSWindow采用粗略的“endEditingFor:”方法。

但这对我来说只是希腊。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

检测单元格的字段编辑器何时启动,等待输入的解决方案是覆盖单元格的setUpFieldEditorAttributes:方法(然后调用其超级消息),像这样:

-(NSText *)setUpFieldEditorAttributes:(NSTextView *)textObj
{
    NSTableView *table = (NSTableView*) self.controlView;
    NSLog(@"editing starts in row %d col %d", (int)table.editedRow, (int)table.editedColumn);
    return [super setUpFieldEditorAttributes:textObj];
}

答案 1 :(得分:-1)

最后我做了这个,这确实有帮助:

常见的解决方法是确保NSTextFieldCell不再是第一个响应者。 在每个按钮触发的ACTION方法中,只需添加:

 program.h
 IBOutlet NSDatePicker        *dateDebut;

 program.m
 - (IBAction)currYear:(id)sender
 {
    [[dateDebut window] makeFirstResponder:dateDebut]; // or any other IBOutlet in the NSWindow
    ...
 }

这会强制单元格版本的结束,以便我们获得干净的东西。