首页 > 解决方案 > 在 List SwiftUI 2.0 中的 TextField 之间切换焦点

问题描述

我想在 SwiftUI 中创建一个列表,其中包含一系列文本字段,用户可以通过按回车键在这些文本字段之间切换。我找到了这篇关于 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({ !$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 都由一个 TextField 构成。如果用户专注于 List 中的第一个 TextField,当按下返回按钮时,我希望焦点转到 List 中的下一个 TextField。如果它是最后一项,我希望关闭键盘。

标签: swiftxcodeswiftuiios14

解决方案


根据上的文档@FocusedBinding

如果多个视图使用相同的键发布绑定,则包装属性将反映距焦点最近的视图的绑定值。

它似乎不允许您操纵firstReponder.

所以不幸的是,你必须坚持使用一个 Wrapped 的UITextField.


推荐阅读