NSTableView, NSArrayController и перезагрузить только после нажатия клавиши?

У меня следующая ситуация:

  1. Внутри первого окна есть один пользовательский вид, который содержит NSTableView.
  2. Есть второе окно, которое действует как форма для текущего объекта за выбором представления таблицы внутри первого окна.

Еще несколько деталей:

  • Я реализовал setDoubleAction: поведение в NSTableView, которое в основном открывает второе окно
  • Представление таблицы привязано к расположенным объектам (подкласса) NSArrayController
  • Определенные элементы интерфейса во втором окне (которое открывается по двойному щелчку) привязаны к выбору NSArrayController
  • Я вложил в класс NSArrayController и изменил следующие функции:

Сначала я изменил addObject: (или add:, это не имеет значения):

- (void)addObject:(id)object
{
    [super addObject:object];
    [self saveTemplatesToDisk];
}

Затем я изменил удалить:

- (void)remove:(id)sender
{
    [super remove:sender];
    [self saveTemplatesToDisk];
}
  • Действие, которое открывает лист настроек, - это всего лишь один слой: [NSApp beginSheet:preferenceWindow modalForWindow:[_preferenceView window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
  • Код, который выполняется после того, как пользователь нажал клавишу возврата / кнопку OK, также не сложен.

Он просто сохраняет текущее содержимое контроллера массива на диск и закрывает второе окно:

- (IBAction)endPreferenceSheet:(id)sender
{
    [templateArrayController saveTemplatesToDisk];

    [NSApp endSheet:preferenceWindow];
    [preferenceWindow orderOut:nil];
}

Наконец вот моя проблема / вопрос

Когда я нажимаю клавишу возврата во втором окне, окно закрывается, данные сохраняются, и NSTableView корректно перезагружается без дальнейшего взаимодействия. Но когда я нажимаю кнопку ОК с помощью мыши, кажется, ничего не происходит. Вот интересная часть: когда я теперь выбираю другую строку в табличном представлении в первом окне после исчезновения второго окна, ранее выбранная строка (читай: обновленный объект) корректно перезагружается и отображает содержимое, которое я отредактировал во втором окно, которое имеет элементы интерфейса, связанные с выбором.

В основном моя реализация работает, но не тогда, когда пользователь использует мышь, чтобы закрыть окно.

Единственное отличие, которое я могу заметить, - это currentEvent, но я не представляю, как это может изменить поведение этого простого приложения.

  • Когда я нажимаю кнопку ОК с помощью мыши: NSEvent: type=LMouseUp loc=(563.055,30.1484) time=58450.2 flags=0 win=0x0 winNum=5371 ctxt=0x0 evNum=8093 click=1 buttonNumber=0 pressure=0 subtype=NSTabletPointEventSubtype deviceID=0 x=19469 y=15838 z=0 buttons=0x0 pressure=0.000000 tilt={0.453108, -0.140629} rotation=0.000000 tangentialPressure=0.000000 vendor1-3=(0, 0, 0)
  • Когда я нажимаю возврат: NSEvent: type=KeyDown loc=(0,300) time=58474.8 flags=0 win=0x0 winNum=5371 ctxt=0x0 chars=" " unmodchars=" " repeat=0 keyCode=36

Любые идеи, как я могу решить свою проблему?

1 ответ

Решение

Запомните цепочку респондента: событие клавиатуры начинается с первого респондента, который будет редактором полей, а затем (если это не обрабатывает его) переходит к следующему респонденту, который будет представлением таблицы. Событие мыши переходит непосредственно к представлению, на котором щелкнул пользователь, и представляет собой кнопку.

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

Решение состоит в том, чтобы метод действия сообщал контроллеру о необходимости редактирования, прежде чем приступить к действительному действию.

Другие вопросы по тегам