@FocusState 与以编程方式生成的 TextField

Jon*_*han 3 swiftui

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

我建立了一个像这样的视图:

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
    }
}

Run Code Online (Sandbox Code Playgroud)

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

shu*_*ngb 6

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

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

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

Fwiw,考虑到它可能如何使用,这似乎有点奇怪,甚至可能是一个错误,我建议向苹果提交反馈给其他认为如此的人。