gpt4 book ai didi

swiftui - @FocusState 以编程方式生成的 TextField

转载 作者:行者123 更新时间:2023-12-05 02:40:33 29 4
gpt4 key购买 nike

我正在尝试基于字符串数组创建一个 TextField 列表,当在键盘上按下返回键时,我想创建一个新的 TextField 并使用新的 @FocusState SwiftUI 属性将其聚焦

我已经构建了一个像这样的 View :

struct ContentView: View {

@State var list: [String] = [""]

@FocusState private var focusField: Int?

var body: some View {

List {
ForEach($list.indices, id: \.self) { idx in
TextField("placeholder", text: $list[idx])
.focused($focusField, equals: idx)
.submitLabel(.next)
.onSubmit {
list.insert("", at: idx + 1)
focusNextField(from: idx)
}
}
}

}

private func focusNextField(from index: Int) {
focusField = index + 1
}
}

问题出在 focusNextField(from index: Int) 方法中,如果我在 focusField = index + 1 之后打印 focusField,它会给我与 index 相同的值。知道我该如何解决这个问题吗?

最佳答案

在我即将开始类似的事情时遇到这个问题,猜测可能已经破解,但为了其他不幸的人的利益:-)

因此,目前事实证明,要在 macOS v12 (Monterey) Beta 6 和 Xcode 13 Beta 5 上使用它,有必要专门为当前的下一个“应用程序状态”外部设置 FocusState “app state”的 UI 更新周期例如

import SwiftUI

struct ContentView: View {
@State var fields: [String] = [""]

@FocusState private var focusField: Int?

var body: some View {
List {
ForEach($fields.indices, id: \.self) { idx in
TextField("placeholder", text: $fields[idx])
.focused($focusField, equals: idx)
.submitLabel(.next)
.onSubmit {
fields.insert("", at: idx + 1)
focusNextField(from: idx)
}
}
}

.onAppear { /// Focus on initial field
guard fields.count > 0 else { return }
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
focusField = 0
}
}
}

private func focusNextField(from index: Int) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
focusField = index + 1
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

Fwiw,考虑到这可能的使用方式,这看起来有点奇怪,甚至可能是一个错误,我建议向 Apple 提交反馈,以供其他任何人这样认为。

关于swiftui - @FocusState 以编程方式生成的 TextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68513880/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com