NSTableView, NSArrayController и перезагрузить только после нажатия клавиши?
У меня следующая ситуация:
- Внутри первого окна есть один пользовательский вид, который содержит NSTableView.
- Есть второе окно, которое действует как форма для текущего объекта за выбором представления таблицы внутри первого окна.
Еще несколько деталей:
- Я реализовал 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 ответ
Запомните цепочку респондента: событие клавиатуры начинается с первого респондента, который будет редактором полей, а затем (если это не обрабатывает его) переходит к следующему респонденту, который будет представлением таблицы. Событие мыши переходит непосредственно к представлению, на котором щелкнул пользователь, и представляет собой кнопку.
Таким образом, разница в том, что табличное представление обрабатывает событие возврата, но оно никогда не видит событие мыши. Когда пользователь нажимает кнопку, вы просто получаете сообщение о действии от кнопки - представление таблицы остается в режиме редактирования.
Решение состоит в том, чтобы метод действия сообщал контроллеру о необходимости редактирования, прежде чем приступить к действительному действию.