【问题标题】:Detect start of cell editing in cell-based NSTableView在基于单元格的 NSTableView 中检测单元格编辑的开始
【发布时间】:2014-04-17 15:43:26
【问题描述】:

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

我通过双击一个单元格来输入它。我在窗口上有其他按钮。任何时候我点击一个按钮,这都会终止单元格编辑,因为我在单元格中什么都没有,并且 NSTableView 不会刷新,即使我调用[myTableView reloadData]

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

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

(void)controlTextDidBeginEditing:(NSNotification *)notification

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

我想准确检测单元格编辑何时开始,即使尚未输入任何内容。

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

最好先让窗口成为​​firstResponder(这样 将 firstReponder 远离焦点区域),如果失败, 求助于 NSWindow 上粗糙的“endEditingFor:”方法。

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

【问题讨论】:

标签: nstableview nsoutlineview nscell nstableviewcell


【解决方案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];
}

【讨论】:

  • 这很尴尬。现在有一个解决方案,唯一可以接受我提供的赏金的人是没有那么有用的答案。
【解决方案2】:

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

常见的解决方法是确保 NSTextFieldCell 不再是 firstResponder。 在每个按钮触发的 ACTION 方法中,只需添加以下内容:

 program.h
 IBOutlet NSDatePicker        *dateDebut;

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

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

【讨论】:

  • 虽然这似乎是问题原始作者的特定设置的解决方法,但这并不是对标题中提出的问题的普遍有用的答案。
猜你喜欢
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多