Как разрешить вставку (cmd+v) в ячейку NSTableView?

Я реализовал копирование значения выбранной ячейки tableView с помощью сочетания клавиш cmd+C. Теперь я пытался реализовать вставку cmd+V. Когда я нажимаю на ячейку tableView, она выбирается. Еще один щелчок, я редактирую его. При редактировании нажимаю cmd+V и ничего не происходит. Я могу написать текст, но не могу вставить его путем копирования и вставки.

Пробовал реализовать вручную через меню Правка -> Вставить Cmd+V.

    @IBAction func onPaste(_ sender: Any) {
      let pasteBoard = NSPasteboard.general
      pasteBoard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
      tableView.selectedCell().set??? = pasteBoard.string(forType: NSPasteboard.PasteboardType.string)
    }

Но не знаю, как установить значение на NSCell.


person Vito Valov    schedule 29.01.2018    source источник
comment
Рассмотрите возможность использования табличного представления на основе представления. В обращении гораздо удобнее. Или просто обновите модель данных и перезагрузите строку.   -  person vadian    schedule 29.01.2018
comment
Основана ли ячейка представления таблицы или основана на представлении? Почему бы вам не использовать сборку в режиме копирования и вставки?   -  person Willeke    schedule 29.01.2018
comment
Это табличное представление ViewBased. Я не знаю, как использовать встроенный c-p. Но мне нужно было реализовать пользовательскую копию. Поэтому, когда нажимается cmd+c с выбранной строкой x, определенное значение столбца y копируется в монтажный стол.   -  person Vito Valov    schedule 29.01.2018
comment
И когда выбрана строка x, монтажный стол должен заменить значение столбца y? Измените данные и перезагрузите строку.   -  person Willeke    schedule 29.01.2018
comment
да, это сработает, но мне было интересно, что мешает общему полю ввода текста получить команду вставки. Я думал, что по умолчанию это должно работать ..   -  person Vito Valov    schedule 29.01.2018
comment
Это должно работать, как вы помещаете строку на монтажный стол?   -  person Willeke    schedule 29.01.2018
comment
Нравится. pastebin.com/PUhXJzW0   -  person Vito Valov    schedule 29.01.2018


Ответы (3)


Моя ошибка. Я не обратил внимания, что когда я изменяю действие «Редактировать меню», оно удаляет поведение по умолчанию. Поскольку я изменил действие по умолчанию для вызова собственного метода, действие :paste было отключено от ярлыка cmd+v.

person Vito Valov    schedule 29.01.2018

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

Всегда можно скопировать и вставить в NSTextField с помощью контекстного меню мыши. Копирование и вставка с помощью клавиатуры с помощью команд cmd-c и cmd-v автоматически доступны, когда доступно меню редактирования.

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

person Ronald Hofmann    schedule 10.01.2019

Чтобы разрешить вставку в TextField, создайте собственный класс TextField, расширив NSTextField :

class EditingTextField: NSTextField {

  private let commandKey = NSEventModifierFlags.command.rawValue
  private let commandShiftKey = NSEventModifierFlags.command.rawValue | NSEventModifierFlags.shift.rawValue

  override func performKeyEquivalent(with event: NSEvent) -> Bool {
    if event.type == NSEventType.keyDown {
      if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
        switch event.charactersIgnoringModifiers! {
        case "x":
          if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
        case "c":
          if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
        case "v":
          if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
        case "z":
          if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
        case "a":
          if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
        default:
          break
        }
      }
      else if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
        if event.charactersIgnoringModifiers == "Z" {
          if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
        }
      }
    }
    return super.performKeyEquivalent(with: event)
  }
}
person Clegrand    schedule 29.01.2018
comment
Это очень громоздкий и объективный код. Почему все rawValue? commandKey и commandShiftKey на самом деле не нужны. Вместо if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey { можно просто написать if event.modifierFlags.contains(.command) { - person vadian; 29.01.2018
comment
И что тогда, заполнить все табличное представление этим пользовательским классом? Расширение табличного представления в структуре документа Я вижу, что на самом деле это NSTextFieldCell. Должен ли я продлить это вместо этого? - person Vito Valov; 29.01.2018