Связанный с CoreData NSTableView теряет фокус ввода при изменении элементов, но только в случае сортировки - PullRequest
3 голосов
/ 07 февраля 2011

У меня есть NSTableView в диалоговом окне, которое связано с коллекцией экземпляров модели CoreData через NSArrayController в режиме «Имя объекта». Таблица отображает name s массива управляемых объектов в одном столбце. Это хорошо работает.

Имена в строках таблицы доступны для редактирования. Если пользователь редактирует имя, когда к таблице не применена сортировка, редактирование продолжается в обычном режиме. После нажатия Return новое имя записывается, а фокус ввода остается в NSTableView. Однако, если щелкнуть заголовок столбца в табличном представлении для сортировки таблицы имен, фокус ввода сбивается после редактирования . Он остается в окне или в более широком представлении (не уверен, какой именно), но выходит за пределы таблицы; кольцо фокусировки исчезает, а цвет фона выделенного элемента меняется с синего на серый. Нажатие Tab снова возвращает фокус ввода в табличное представление.

Это только происходит, если содержимое таблицы отсортировано. Если для привязки выбрано значение «Непрерывно обновляет значение», это катастрофично, так как в ту минуту, когда вводятся любые символы, табличное представление, кажется, хочет пересортировать себя (это нормально), и фокус выпрыгивает из него (это не так, как для пользователя пытался что-то напечатать).

Что касается этого аспекта системы, то здесь нет кода - все это делается с помощью привязок, установленных в Интерфейсном Разработчике. Предположительно, я случайно установил или очистил какой-то параметр, который у меня не должен быть.

В случае, если это поможет читателю понять, в чем дело - у меня также есть модальный лист, прикрепленный к диалоговому окну, содержащему NSTableView. Лист используется для редактирования сведений об элементе, выбранном в табличном представлении. Элементы управления в этом также связаны с привязками к модели CoreData, используя тот же NSArrayController, что и диалоговое окно «позади» листа. Появляется та же проблема - как только вводится новое имя, фокус возвращается к диалоговому окну «позади» модального листа.

Единственный задействованный код - это то, что используется для обработки действия «изменить этот элемент» и запуска модального сеанса для листа.

Что происходит? Куда движется фокус и почему он перемещается только из-за повторной сортировки в NSTableView?

Спасибо!

1 Ответ

6 голосов
/ 10 февраля 2011

Объекты NSArrayController отмечены галочкой « Автоперестановка содержимого » на соответствующей панели инспектора Интерфейсного Разработчика.Это делало не то, что я думал, и было причиной проблемы с кражей фокуса.

Я наконец сузил это, создав приложение CoreData без косточек, которое просто добавляло имена в табличное представление.Код почти не требуется;Интерфейсный конструктор на 99,5% и привязки, только с дополнительным выходом и единственной строкой связующего кода, чтобы сообщить контроллеру массива для модели CoreData о контексте управляемого объекта, который создается в делегате приложения кодом, который автоматически сгенерировал Интерфейсный конструктор.Установка флага «Автоматически переупорядочить содержимое» в тестовой программе вызвала такое же странное поведение фокуса ввода.

Так что, если у вас есть проблемы с кражей фокуса с таблицей объектов, связанных с CoreData через контроллер массива, проверьтеФлаг автоперестановки контроллера массива!

...