web-dev-qa-db-fra.com

Comment définir le type de clavier de TextField dans SwiftUI?

Je n'arrive pas à trouver d'informations ou à comprendre comment définir le type de clavier sur un TextField pour SwiftUI. Il serait également agréable de pouvoir activer la propriété de texte sécurisé, de masquer les mots de passe, etc.

Cet article montre comment "encapsuler" un UITextField, mais je préfère ne pas utiliser de contrôles d'interface utilisateur si je ne le dois pas. Comment faire de TextField le premier répondant?

Quelqu'un a-t-il des idées sur la façon dont cela peut être fait sans envelopper un contrôle de l'interface utilisateur de la vieille école?

19
Aaron Bertsch

Pour créer un champ dans lequel vous pouvez saisir du texte sécurisé, vous pouvez utiliser SecureField($password)

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

Si vous voulez définir le contentType d'un textField par exemple. .oneTimeCode vous pouvez le faire comme ça. Fonctionne également avec keyboardType

TextField($code)
    .textContentType(.oneTimeCode)
    .keyboardType(.numberPad)
28
Viktor Gardart

Nous n'avons plus besoin d'utiliser des hacks. La bêta 5 a apporté un nouveau modificateur pour définir le type de clavier. Par exemple, pour utiliser un pavé numérique:

.keyboardType(.numberPad)

Il y a aussi autocapitalization() et une EnvironmentValue disableAutocorrection.

12
kontiki

Définissez .keyboardType(.numberPad) sur le TextField. Facile!

1
Tejas

Ce qui suit encapsule une classe UITextField appelée UIKitTextField en utilisant UIViewRepresentable. Le type de clavier est défini sur .decimalPad mais peut être défini sur n'importe quel type de clavier valide.

//  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)
  }
}

Dans le ContentView.Swift J'ai créé deux TextFields. Le premier est le UIKitUITextField enveloppé et le second est le SwiftUI TextField. La liaison de données est la même, donc chacun affichera le même texte lors de sa saisie.

// 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
1
dwitt

Pour définir le type de clavier TextField's, Vous devez ajouter le modificateur .keyboardType().

TextField(placeHolder, text: your text)
    .keyboardType(.numberPad)
0
Rohit Makwana

Cela fonctionne pour moi:

import UIKit
import SwiftUI

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)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        resignFirstResponder()
        return true
    }

}

struct UBSTextField : UIViewRepresentable {

    @Binding var myText: String
    let placeHolderText: String

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

    class Coordinator: NSObject {
        var textBinding: Binding<String>
        init(text: Binding<String>) {
            self.textBinding = text
        }

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

    func makeUIView(context: Context) -> UIKitTextField {

        let textField = UIKitTextField(frame: .zero)

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

        textField.text = self.myText
        textField.placeholder = self.placeHolderText
        textField.borderStyle = .none
        textField.keyboardType = .asciiCapable
        textField.returnKeyType = .done
        textField.autocapitalizationType = .words
        textField.clearButtonMode = .whileEditing

        return textField
    }

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

Je suis le développeur qui a répondu à ce message - il n'y a aucun moyen officiel de le faire pour le moment. Votre meilleur pari pour le moment est d'envelopper UITextField - Matteo Pacini

Cela résume, je suppose que nous sommes coincés avec l'emballage UITextField pour l'instant.

0
Aaron Bertsch