在列表SwiftUI 2.0中的文本字段之间切换焦点

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

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

    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: {
                    })
            }
        }
    }
}

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

根据
@FocusedBinding

如果多个视图使用同一键发布绑定,wrapped属性将反映最接近焦点的视图的绑定值

它似乎不允许您操作
firstReponder


不幸的是,根据
@FocusedBinding

如果多个视图使用同一键发布绑定,wrapped属性将反映最接近焦点的视图的绑定值

它似乎不允许您操作
firstReponder

因此,不幸的是,您必须坚持使用包装的
UITextField