Je travaille avec SwiftUI TextField View
. J'ai principalement 2 questions,
1) Dans Swift, nous pouvons définir Touche Retour (Traits de saisie de texte) sur Next
pour TextField à partir du storyboard comme ce droit? Pour cela, quel modificateur utiliser dans SwiftUI?
2) J'ai deux champs de texte, comment naviguer vers le prochain champ de texte lorsque je clique sur le bouton retour/suivant du clavier?
Quelqu'un peut-il aider avec cette solution ou toute autre alternative pour exécuter cette fonctionnalité?
Ma question concerne SwiftUI et non UIKit :)
Toute aide serait très appréciée!!
Pour résoudre vos deux problèmes, vous devez travailler avec UIKit à partir de SwiftUI . Tout d'abord, vous devez personnaliser TextField en utilisant UIViewRepresentable . Voici l'exemple de code à des fins de test, bien que le code ne soit pas si élégant. Je parie qu'il y aura une solution plus robuste.
Voici l exemple de code:
import SwiftUI
struct KeyboardTypeView: View {
@State var firstName = ""
@State var lastName = ""
@State var focused: [Bool] = [true, false]
var body: some View {
Form {
Section(header: Text("Your Info")) {
TextFieldTyped(keyboardType: .default, returnVal: .next, tag: 0, text: self.$firstName, isfocusAble: self.$focused)
TextFieldTyped(keyboardType: .default, returnVal: .done, tag: 1, text: self.$lastName, isfocusAble: self.$focused)
Text("Full Name :" + self.firstName + " " + self.lastName)
}
}
}
}
struct TextFieldTyped: UIViewRepresentable {
let keyboardType: UIKeyboardType
let returnVal: UIReturnKeyType
let tag: Int
@Binding var text: String
@Binding var isfocusAble: [Bool]
func makeUIView(context: Context) -> UITextField {
let textField = UITextField(frame: .zero)
textField.keyboardType = self.keyboardType
textField.returnKeyType = self.returnVal
textField.tag = self.tag
textField.delegate = context.coordinator
textField.autocorrectionType = .no
return textField
}
func updateUIView(_ uiView: UITextField, context: Context) {
if isfocusAble[tag] {
uiView.becomeFirstResponder()
} else {
uiView.resignFirstResponder()
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var parent: TextFieldTyped
init(_ textField: TextFieldTyped) {
self.parent = textField
}
func updatefocus(textfield: UITextField) {
textfield.becomeFirstResponder()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if parent.tag == 0 {
parent.isfocusAble = [false, true]
parent.text = textField.text ?? ""
} else if parent.tag == 1 {
parent.isfocusAble = [false, false]
parent.text = textField.text ?? ""
}
return true
}
}
}
Vous ne pouvez pas, il n'y a pas encore de concept de chaîne de répondeur dans SwiftUI. Vous ne pouvez pas initier par programme le focus sur un View
car ce ne sont pas réellement les vues elles-mêmes, simplement des structures qui décrivent comment les vues doivent être configurées. Je suppose qu'il peut éventuellement être exposé via EnvironmentValues
(comme la troncature de ligne, la correction automatique, etc.) mais il n'existe pas actuellement.