Как сделать первый респондент в SwiftUI macOS - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь сделать свой textField (NSViewRepresentable wrapped NSTextField) первым респондентом, когда он появляется. Я проверил много ответов в этой ветке , но они либо не работают:

func updateNSView(_ nsView: MyField, context: Context) {
  if some_condition {
    print(nsViews.becomeFirstResponder()) // returns false
    negate_condition()
  }
  ...
}

, либо он вылетает с журналами (=== AttributeGraph: cycle detected through attribute 43 ===):

func updateNSView(_ nsViews: MyField, context: Context) {
  if some_condition {
    Window.thisWindow?.makeFirstResponder(nsViews)
    negate_condition()
  }
  ...
}

Что Я пытаюсь достичь:

@State var fieldActive: Bool
body: some View {
  MyField(...).onAppear { /*makeFirstResponder if fieldActive == true*/ }
}

Может кто-нибудь, пожалуйста, помогите мне в этом? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

@ Аспери предоставил правильный подход, я нашел другой путь к ответу. Я использовал библиотеку SwiftUI-Introspect для завершения работы с SwiftUI TextField (без переноса NSTextField), вот код:

struct SearchBar {
  @Binding var shouldActivate: Bool
  var body: some View {
    TextField("", text: text)
      .textFieldStyle(PlainTextFieldStyle())
      .introspectTextField { textField in 
          if self.shouldActivate {
              textField.becomeFirstResponder()
              self.shouldActivate = false
          }
          textField.focusRingType = .none
      }
}
0 голосов
/ 19 апреля 2020

Если ваш MyField является NSTextField, работает следующее. Протестировано с Xcode 11.4 / macOS 10.15.4

  func makeNSView(context: Context) -> MyField {
    let view = MyField()

    // ... other properties set up here

    // wait for next cycle, so field be already in window
    DispatchQueue.main.async { 
        view.window?.makeFirstResponder(view)
    }
    return view
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...