在编辑基于单元格的表视图时拦截撤消

时间:2012-02-16 18:27:25

标签: cocoa nstableview nstextview nstextfieldcell nsresponder

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

这是一个基于单元格的表视图,其中包含一系列列,这些列的值相互影响,因此填充某些列会自动填充其他列。当用户在编辑会话中按下Cmd-Z时,撤消管理员可以更改当前正在编辑的属性,并为用户带来令人困惑的结果。

以下是一个例子:

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

enter image description here

步骤2:用户按下选项卡,模型自动更新第三,第四和第五列:

enter image description here

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

enter image description here

步骤4:没有输入任何内容,用户按下取消编辑的标签,第三列的值消失:

enter image description here

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

当编辑其中一个单元格时,我只想拦截Cmd-Z和Shift-Cmd-Z并忽略它们。我想我应该在编辑期间覆盖-keyDown:在第一响应者身上。但那是什么?表视图根本不会获取这些关键事件,并且单元格也不是响应者。

1 个答案:

答案 0 :(得分: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];
}