在 List SwiftUI 2.0 中的 TextFields 之间切换焦点

Switching focus between TextFields in List SwiftUI 2.0

我想在 SwiftUI 中创建一个包含一系列文本字段的列表,用户可以通过按 return 键在这些文本字段之间切换。我发现 this article,关于 FocusBinding 属性,但我不确定我是否在写入路径上。最初,我在 Swift 1.0 中设置了一些东西,将 UITextField 包装在 UIViewRepresentable 中,但这仍然存在一些问题。使用 Swift 2.0,检查 TextField 的更改和响应似乎容易得多,而且似乎键盘偏移的一些复杂问题已经为您解决了,所以如果我不这样做的话我会喜欢的不必使用这样的包装器。

    struct VirtuesListBody: View {
    @EnvironmentObject var settings: UserSettings
    @State var curIdx = -1

    var body: some View {
        List {
            ForEach(Array(zip(self.settings.virtues.enumerated().filter({ !.deleted }).map({ [=10=].offset }), self.settings.virtues.map({ ![=10=].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: {
                    })
            }
        }
    }
}

基本上,我有一个 VirtuesRowItem 视图列表,每个 VirtuesRowItem 都由一个 TextField 构成。如果用户关注列表中的第一个 TextField,当按下 return 按钮时,我希望焦点转到列表中的下一个 TextField。如果它是最后一项,我希望键盘被关闭。

根据 @FocusedBinding

上的文档

If multiple views publish bindings using the same key, the wrapped property will reflect the value of the binding from the view closest to focus.

它似乎不允许你能够操纵 firstReponder

很遗憾,您必须坚持使用包裹 UITextField