MacOS:有条件呈现的 TextField 的默认焦点
MacOS: Default focus for conditionally rendered TextField
更新 1:
- 我试过在
TextField
的 onAppear
回调中调用 resetFocus
,也没用。
- 如果
TextField
与初始应用程序渲染一起渲染,即使没有修改 prefersDefaultFocus
,它也会自动聚焦。所以也许 prefersDefaultFocus
根本不适用于 TextField
?
原文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
出现时立即将焦点设置到它。
更新 1:
- 我试过在
TextField
的onAppear
回调中调用resetFocus
,也没用。 - 如果
TextField
与初始应用程序渲染一起渲染,即使没有修改prefersDefaultFocus
,它也会自动聚焦。所以也许prefersDefaultFocus
根本不适用于TextField
?
原文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
出现时立即将焦点设置到它。