Перехват отмен при редактировании табличного представления на основе ячеек - PullRequest
0 голосов
/ 16 февраля 2012

Я бы хотел перехватить или отключить Cmd-Z / Shift-Cmd-Z во время сеанса редактирования текста для ячейки табличного представления.

Это табличное представление на основе ячеек с серией столбцов, значения которых влияют друг на друга, так что заполнение некоторых столбцов заполнит другие автоматически. Когда пользователь нажимает Cmd-Z в середине сеанса редактирования, менеджер по отмене может изменить свойство, редактируемое в настоящее время, с ошибочными результатами для пользователя.

Вот пример:

Шаг 1: Пользователь вводит «.030» во втором столбце:

enter image description here

Шаг 2. Пользователь нажимает на вкладку, модель автоматически обновляет столбцы три, четыре и пять:

enter image description here

Шаг 3: Пользователь нажимает Ctrl-Z, модель отменяет изменения в столбцах два, три, четыре и пять, но сеанс редактирования все еще продолжается, поэтому в третьем столбце отображается старое значение:

enter image description here

Шаг 4: ничего не печатая, пользователь нажимает на вкладку, которая отменяет редактирование, и значение из третьего столбца исчезает:

enter image description here

Здесь на самом деле ничего "неправильного" не происходит, но это сбивает с толку.

Когда одна из ячеек редактируется, я просто хочу перехватить Cmd-Z и Shift-Cmd-Z и игнорировать их. Я думаю, что я должен переопределить -keyDown: в том, кто первым отвечает во время этого редактирования. Но что это? Табличное представление вообще не получает эти ключевые события, и ячейка также не является респондентом.

1 Ответ

0 голосов
/ 16 февраля 2012

Нашел рабочее решение.В моем 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];
}
...