Basculer entre les TextFields dans List SwiftUI 2.0
Je voudrais créer une liste dans SwiftUI avec une série de TextFields que l'utilisateur peut basculer entre en appuyant sur la touche retour. J'ai trouvé cet article sur la propriété FocusBinding, mais je ne suis pas sûr d'être sur le chemin d'écriture. À l'origine, j'avais mis en place quelque chose dans Swift 1.0 qui enveloppait UITextField dans UIViewRepresentable, mais cela posait encore des problèmes. Avec Swift 2.0, il semble beaucoup plus facile de vérifier les modifications apportées à un TextField et d'y répondre, et il semble que certaines des complications des décalages de clavier aient été résolues pour vous, alors j'aimerais bien que je n'ai pas à utiliser un emballage comme celui-ci.
struct VirtuesListBody: View {
@EnvironmentObject var settings: UserSettings
@State var curIdx = -1
var body: some View {
List {
ForEach(Array(zip(self.settings.virtues.enumerated().filter({ !$1.deleted }).map({ $0.offset }), self.settings.virtues.map({ !$0.deleted }))), id: \.0) { idx, _ in VirtuesRowItem(curIdx: self.$curIdx, idx: idx)
}
}
}
}
struct VirtuesRowItem: View {
@EnvironmentObject var settings: UserSettings
@Binding var curIdx: Int
let idx: Int
var body: some View {
Group {
if idx == self.settings.virtues.count - 1 {
TextField("", text: self.$settings.virtues[idx].name, onEditingChanged: { _ in }, onCommit: { }) } else { TextField("", text: self.$settings.virtues[idx].name,
onEditingChanged: { _ in
}, onCommit: {
})
}
}
}
}
Fondamentalement, j'ai une liste de vues VirtuesRowItem, et chaque VirtuesRowItem est construit à partir d'un TextField. Si l'utilisateur se concentre sur le premier TextField de la liste, lorsque vous appuyez sur le bouton de retour, je souhaite que le focus passe au TextField suivant dans la liste. S'il s'agit du dernier élément, je souhaite que le clavier soit supprimé.
Réponses
Selon la documentation sur @FocusedBinding
Si plusieurs vues publient des liaisons à l'aide de la même clé, la propriété enveloppée reflétera la valeur de la liaison à partir de la vue la plus proche du focus.
Cela ne semble pas vous permettre de manipuler le fichier firstReponder.
Donc, malheureusement, vous devrez vous en tenir à un emballage UITextField.