Basculer entre les TextFields dans List SwiftUI 2.0

Sep 09 2020

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

youjin Sep 09 2020 at 00:49

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.