NSTableView, NSArrayController и перезагрузить только после нажатия клавиши? - PullRequest
0 голосов
/ 01 апреля 2010

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

  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 Ответ

2 голосов
/ 04 апреля 2010

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

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

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

...