0

我想在表格视图单元格的文本编辑会话期间拦截或禁用 Cmd-Z/Shift-Cmd-Z。

它是一个基于单元格的表格视图,具有一系列列,其值相互影响,因此填充某些列将自动填充其他列。当用户在编辑会话中间按下 Cmd-Z 时,撤消管理器可以更改当前正在编辑的属性,这会给用户带来混乱的结果。

这是一个例子:

第 1 步:用户在第二列输入“.030”:

在此处输入图像描述

第二步:用户按下tab,模型自动更新第三、四、五列:

在此处输入图像描述

第 3 步:用户按下 Ctrl-Z,模型撤消对第 2、3、4 和 5 列的更改,但编辑会话仍在进行中,因此旧值显示在第 3 列中:

在此处输入图像描述

第 4 步:不输入任何内容,用户按下取消编辑的选项卡,第三列中的值消失:

在此处输入图像描述

这里实际上没有发生任何“错误”,但这令人困惑。

当正在编辑其中一个单元格时,我只想拦截 Cmd-Z 和 Shift-Cmd-Z 并忽略它们。我认为我应该-keyDown:在编辑期间优先考虑急救人员。但那是什么?表格视图根本没有得到那些关键事件,单元格也不是响应者。

4

1 回答 1

0

找到了一个可行的解决方案。在我的NSTableView子类中:

// Disable undo and redo while table's field editors have first responder status
-(BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    if (self != self.window.firstResponder)
        if (@selector(undo:) == menuItem.action || @selector(redo:) == menuItem.action)
            return NO;
    return YES;
}

// Intercept undo events while table's field editors have first responder status
-(IBAction)undo:(id)sender {
    if (self != self.window.firstResponder)
        [self noResponderFor:_cmd];
    else
        [self.nextResponder tryToPerform:@selector(undo:) with:sender];
}
于 2012-02-16T18:29:37.943 回答