Как установить тип клавиатуры TextField в SwiftUI? - PullRequest
2 голосов
/ 09 июня 2019

Я не могу найти какую-либо информацию или выяснить, как установить тип клавиатуры в TextField для SwiftUI.Также было бы неплохо иметь возможность включить свойство защищенного текста, скрыть пароли и т. Д.

В этом посте показано, как "обернуть" UITextField, но я бы предпочел не использовать какие-либо элементы управления UI, если яне надо Как сделать так, чтобы TextField стал первым респондентом?

У кого-нибудь есть идеи, как это можно сделать, не оборачивая старый пользовательский интерфейс управления?

Ответы [ 3 ]

7 голосов
/ 10 июня 2019

Для создания поля, в котором вы можете ввести защищенный текст, вы можете использовать SecureField($password)

https://developer.apple.com/documentation/swiftui/securefield

Если вы хотите установить contentType textField на например. .oneTimeCode Вы можете сделать это так.

TextField($code)
    .textContentType(.oneTimeCode)
1 голос
/ 25 июня 2019

Следующее оборачивает класс UITextField с именем UIKitTextField с использованием UIViewRepresentable. Тип клавиатуры установлен на .decimalPad, но может быть установлен любой допустимый тип клавиатуры.

//  UIKitTextField.swift

import UIKit

class UIKitTextField: UITextField, UITextFieldDelegate {

  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    delegate = self
  }

  required override init(frame: CGRect) {
    super.init(frame: frame)
    delegate = self
    self.setContentHuggingPriority(.defaultHigh, for: .vertical)
  }
}

В ContentView.Swift я создал два TextFields. Первый - это UIKit UITextField, а второй - SwiftUI TextField. Привязка данных одинакова, поэтому каждый будет отображать один и тот же текст при вводе.

// ContentView.Swift

import SwiftUI
import UIKit

struct MyTextField : UIViewRepresentable {

  @Binding var myText: String

  func makeCoordinator() -> MyTextField.Coordinator {
    return Coordinator(text: $myText)
  }

  class Coordinator: NSObject {
    @Binding var text: String
    init(text: Binding<String>) {
      $text = text
    }

    @objc func textFieldEditingChanged(_ sender: UIKitTextField) {
      self.text = sender.text ?? ""
    }
  }

  func makeUIView(context: Context) -> UIKitTextField {

    let myTextField = UIKitTextField(frame: .zero)

    myTextField.addTarget(context.coordinator, action: #selector(Coordinator.textFieldEditingChanged(_:)), for: .editingChanged)

    myTextField.text = self.myText
    myTextField.placeholder = "placeholder"
    myTextField.borderStyle = .roundedRect
    myTextField.keyboardType = .decimalPad

    return myTextField
  }

  func updateUIView(_ uiView: UIKitTextField,
                    context: Context) {
    uiView.text = self.myText
  }

}


struct MyTextFieldView: View {
  @State var myText: String = "Test"
  var body: some View {
    VStack {
      MyTextField(myText: $myText)
        .padding()
      TextField($myText)
        .textFieldStyle(.roundedBorder)
        .padding()
    }
  }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
  static var previews: some View {
    Group{
      MyTextFieldView().previewLayout(.sizeThatFits)
      MyTextFieldView().previewDevice("iPhone Xs")
    }
  }
}
#endif
0 голосов
/ 09 июня 2019

Я разработчик, который ответил на этот пост - нет официального способа сделать это в данный момент. На данный момент лучше всего обернуть UITextField - Маттео Пачини

Это подводит итог, думаю, что мы застряли с упаковкой UITextField на данный момент.

...