0

テーブル ビュー セルのテキスト編集セッション中に、Cmd-Z/Shift-Cmd-Z をインターセプトまたは無効にしたいと考えています。

これは、値が相互に影響する一連の列を含むセルベースのテーブル ビューであり、一部の列に入力すると他の列に自動的に入力されます。ユーザーが編集セッションの途中で Cmd-Z を押すと、元に戻すマネージャーが現在編集中のプロパティを変更する可能性があり、ユーザーを混乱させる結果になります。

次に例を示します。

ステップ 1: ユーザーは 2 列目に「.030」と入力します。

ここに画像の説明を入力

ステップ 2: ユーザーがタブを押すと、モデルは列 3、4、および 5 を自動的に更新します。

ここに画像の説明を入力

ステップ 3: ユーザーが Ctrl-Z を押すと、モデルは列 2、3、4、および 5 への変更を元に戻しますが、編集セッションがまだ進行中であるため、古い値が列 3 に表示されます。

ここに画像の説明を入力

ステップ 4: ユーザーが何も入力せずにタブを押して編集をキャンセルすると、3 列目の値が消えます。

ここに画像の説明を入力

ここで実際に「間違った」ことは何も起きていませんが、混乱を招きます。

セルの 1 つが編集されているときに、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 に答える