Как использовать редактирование NSControl (withFrame: editor: Delegate: Event :)? - PullRequest
0 голосов
/ 27 января 2019

У меня есть пользовательский NSControl, и я пытаюсь заставить работать функцию edit(withFrame:editor:delegate:event:).После вызова я ожидаю, что редактор полей появится в моем представлении, но ничего не происходит.

Я прочитал документацию для этой функции и создал минимальный пример:

class MyView: NSControl, NSControlTextEditingDelegate, NSTextDelegate {
  required init?(coder: NSCoder) {
    super.init(coder: coder)
    isEnabled = true
  }

  override func mouseDown(with event: NSEvent) {
    let editor = window!.fieldEditor(true, for: nil)!
    let rect = bounds.insetBy(dx: 10.0, dy: 10.0)
    self.edit(withFrame: rect, editor: editor, delegate: self, event: event)
  }

  func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
    return true
  }

  func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
    self.endEditing(fieldEditor)
    return true
  }

  func textShouldBeginEditing(_ textObject: NSText) -> Bool {
    return true
  }
}

Как видно из примера, я не совсем уверен, соответствует ли NSControlTextEditingDelegate или NSTextDelegate.Кажется, что ни одна из функций, которые я реализую, не вызывается.

Или, возможно, я неправильно понимаю назначение функции?Должен ли я переопределить это вместо того, чтобы называть это?

1 Ответ

0 голосов
/ 12 февраля 2019

Я не специалист по полевому редактору, но просмотр документации Apple, похоже, указывает на то, что он предназначен для реализации на элементе управления класса NSCell и визуализации текста самостоятельно.Если вы хотите, чтобы редактор полей появился в приведенном выше примере, вы должны вставить редактор полей в иерархию представлений.Это не происходит автоматически.

class CustomTextControl: NSControl {
    override func mouseDown(with event: NSEvent) {
        // Make sure
        if currentEditor() == nil {
            if let controlWindow = window {
                if controlWindow.makeFirstResponder(controlWindow) {
                    // It is safe to claim the field editor
                    if let editor = controlWindow.fieldEditor(true, for: nil) as? NSTextView {
                        addSubview(editor)
                        editor.frame = bounds
                        edit(withFrame: bounds, editor: editor, delegate: nil, event: event)
                    }
                } else {
                    // Some other control has first responder, force first responder to resign
                    controlWindow.endEditing(for: nil)
                }
            }
        }
    }
}

Я рекомендую вам ознакомиться с документацией Apple по руководству по архитектуре текста какао.В частности, Работа с полевым редактором и документацией NSCell .Интересно, это нетривиальная задача.

Чего ты пытаешься достичь, мне интересно.

...