Получение ключей удаления / возврата в SproutCore - PullRequest
1 голос
/ 13 сентября 2010

У меня есть панель SproutCore, в частности PalettePane, которая включает форму, привязанную к объекту в другом месте экрана. Панель вызывает проблемы с взаимодействием удаления объекта. Я хочу, чтобы это работало:

  • Если поле ввода текста находится в фокусе, клавиши возврата / удаления должны применяться к этим полям (т. Е. Редактировать текст)
  • Если поле ввода текста не имеет фокуса, клавиши возврата / удаления должны удалять выбранный объект, связанный с формой. (Панель появляется, когда пользователь выбрал объект, поэтому, если панель существует, это выделенный объект.)

Пока что я получаю одно или другое, а не оба. Если я установлю acceptsKeyPane: YES на панели, я получу клавиши возврата / удаления, применяемые к текстовым полям, но не удаляю выбранные объекты, когда текстовые поля не имеют фокуса. Если я использую acceptsKeyPane: NO, когда я редактирую текстовое поле и нажимаю клавишу Backspace, он удаляет объект, который я пытался редактировать.

Чтобы добавить оскорбление к травме, в Firefox с acceptsKeyPane: YES клавиша Backspace перехватывается браузером и интерпретируется как нажатие кнопки «назад», что будет неприятно для пользователя.

Я посмотрел на код root_responder.js и похоже, что SproutCore по-разному обрабатывает возвратные пространства для Firefox, но если я могу их обработать, как описано выше, различие между FF и другими браузерами должно быть спорным.

ETA, май 2011 г. При чтении ответов на этот вопрос имейте в виду, что API-интерфейс SproutCore для версий 1.5, 1.6 и выше может не совпадать с этим.

1 Ответ

3 голосов
/ 20 сентября 2010

Вот как мы, наконец, завершили это:

  • Когда панель была создана, мы вызвали becomeFirstResponder() на ней.
  • Мы добавили acceptsFirstResponder: YES к ее определению вида.
  • Затем мы добавили в определение представления:
    keyDown: function(evt) {
      return this.interpretKeyEvents(evt) ? YES : NO;
    },

    deleteBackward: function() {
      this.get('objectToEdit').destroy();
      return YES;
    },

    deleteForward: function() {
      this.get('objectToEdit').destroy();
      return YES;
    }

... и это помогло.

...