SwiftUI Представляемое текстовое поле изменяется Шрифт при исчезновении - PullRequest
1 голос
/ 29 мая 2020

Я использую представительный ViewController для пользовательского NSTextField в SwiftUI для MacOS. Я применяю индивидуальный увеличенный размер шрифта для этого TextField. Это отлично работает, у меня был вопрос относительно этого topi c в моем последнем вопросе здесь .

Теперь я устанавливаю шрифт TextField в моем viewDidAppear() методе, который работает хорошо. Я вижу шрифт побольше. Проблема в том, что теперь, когда мой взгляд не в фокусе, размер текста уменьшается до нормального. Когда я go возвращаюсь и снова активирую окно, я вижу маленький размер шрифта. Когда я снова набираю текст, он обновляется, и я вижу правильный размер шрифта.

Это мой код, который я использую:

class AddTextFieldController: NSViewController {
    @Binding var text: String
    let textField = NSTextField()
    var isFirstResponder : Bool = true

    init(text: Binding<String>, isFirstResponder : Bool = true) {
        self._text = text
        textField.font = NSFont.userFont(ofSize: 16.5)
        super.init(nibName: nil, bundle: nil)
        NSLog("init")
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func loadView() {
        textField.delegate = self
        //textField.font = NSFont.userFont(ofSize: 16.5)
        self.view = textField
    }

    override func viewDidAppear() {
        self.view.window?.makeFirstResponder(self.view)
        textField.font = NSFont.userFont(ofSize: 16.5)
    }
}

extension AddTextFieldController: NSTextFieldDelegate {

  func controlTextDidChange(_ obj: Notification) {
    if let textField = obj.object as? NSTextField {
      self.text = textField.stringValue
    }
    textField.font = NSFont.userFont(ofSize: 16.5)

  }
}

И это представимое:

struct AddTextFieldRepresentable: NSViewControllerRepresentable {

  @Binding var text: String

  func makeNSViewController(
    context: NSViewControllerRepresentableContext<AddTextFieldRepresentable>
  ) -> AddTextFieldController {
    return AddTextFieldController(text: $text)
  }

  func updateNSViewController(
    _ nsViewController: AddTextFieldController,
    context: NSViewControllerRepresentableContext<AddTextFieldRepresentable>
  ) {
    }
}

Вот демонстрация:

enter image description here

Я думал об использовании уведомлений, когда представление возвращается, но не уверен

NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: NSApplication.willBecomeActiveNotification, object: nil)

1 Ответ

1 голос
/ 29 мая 2020

Вот решение. Протестировано с Xcode 11.4 / macOS 10.15.4

class AddTextFieldController: NSViewController {
    @Binding var text: String
    let textField = MyTextField()  // << overridden field

и необходимыми настраиваемыми классами (оба !!) для ячейки и элемента управления ( во всех других местах, просто удалите использование шрифта пользователя, поскольку оно больше не требуется ):

class MyTextFieldCell: NSTextFieldCell {
    override var font: NSFont? {
        get {
            return super.font
        }
        set {
            // system tries to reset font to default several
            // times (here!), so don't allow that
            super.font = NSFont.userFont(ofSize: 16.5)
        }
    }
}

class MyTextField: NSTextField {
    override class var cellClass: AnyClass? {
        get { MyTextFieldCell.self }
        set {}
    }

    override var font: NSFont? {
        get {
            return super.font
        }
        set {
            // system tries to reset font to default several
            // times (and here!!), so don't allow that
            super.font = NSFont.userFont(ofSize: 16.5)
        }
    }
}
...