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?
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)
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
.
Définissez .keyboardType(.numberPad)
sur le TextField. Facile!
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 UIKit
UITextField
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
Pour définir le type de clavier TextField's
, Vous devez ajouter le modificateur .keyboardType()
.
TextField(placeHolder, text: your text)
.keyboardType(.numberPad)
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
}
}
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.