MacOS:有条件呈现的 TextField 的默认焦点

MacOS: Default focus for conditionally rendered TextField

更新 1:

原文post:

我正在关注 this guide by Apple。单击按钮并呈现 TextField 后,我希望它自动聚焦,但它没有。

如果 isEditing 的初始值为 true,即 TextField 与初始应用程序渲染一起渲染,它会自动聚焦。

import SwiftUI

struct ContentView: View {
    @Namespace private var namespace
    @State private var isEditing: Bool = false
    @State private var textInput: String = ""

    var body: some View {
        VStack {
            Button("Toggle editing") { isEditing = !isEditing }
            if isEditing {
                TextField("Write something", text: $textInput)
                    .prefersDefaultFocus(in: namespace)
            }
        }
    }
}

我尝试通过以下两种方式调用 resetFocus,其中 none 有帮助。

    // ...

    @Environment(\.resetFocus) var resetFocus

    // ...

    @State private var isEditing: Bool = false {
        didSet {
            resetFocus(in: namespace)
        }
    }

    // ...
    // ...

        @Environment(\.resetFocus) var resetFocus

    // ...

            if isEditing {
                TextField("Write something", text: $textInput)
                    .prefersDefaultFocus(in: namespace)
                    .background(textFieldDefaultFocusSetter)
            }

    // ...

    var textFieldDefaultFocusSetter: some View {
        resetFocus(in: namespace)
        return EmptyView()
    }

我错过了什么?例如。 prefersDefaultFocus 是否仅针对应用初始呈现期间呈现的视图进行评估?

我不知道 prefersDefaultFocus 是否适用于条件视图,但在您的情况下,只需明确设置即可。添加:

 @FocusState private var focus: Bool 

和:

VStack {
        Button("Toggle editing") {
            isEditing = !isEditing
            focus = true
        }
        if isEditing {
            TextField("Write something", text: $textInput)
                .focused($focus)
//                    .prefersDefaultFocus(in: namespace)
        }
    }
}

这会在您的 TextField 出现时立即将焦点设置到它。