swift - 在 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。如果它是最后一项,我希望关闭键盘。
解决方案
根据上的文档@FocusedBinding
如果多个视图使用相同的键发布绑定,则包装属性将反映距焦点最近的视图的绑定值。
它似乎不允许您操纵firstReponder
.
所以不幸的是,你必须坚持使用一个 Wrapped 的UITextField
.
推荐阅读
- permissions - TYPO3 权限:允许后端用户复制内容元素但不能编辑它们(或:如何为用户提供内容元素库以进行复制)
- r - 通过在 r 中的 for 循环内循环一个向量,使用 mutate 添加新变量
- html - 如何将 hmtl_node 转换为 R 中的列表
- android - 撰写导航到已经在后台堆栈中的屏幕
- google-cloud-platform - BigQuery 定价,是 Terabyte 还是 Tebibyte?
- jmeter - 如何在jmeter的Include控制器中为测试片段提供相对路径
- terraform - 如何使用定制映像创建 IBM Cloud VSI
- amazon-web-services - Aws 目标组:每次都击中相同的目标
- python - 如何创建一个填充向量平均值的numpy数组
- windows - 从 Windows 群集通用服务打开端口