I have a parent view with a @FocusState
variable that I want to pass into a child view that contains a TextField
. I want to be able to change the FocusState
from within the child view, but I get the errors Cannot assign to property: 'self' is immutable
and Cannot assign value of type 'Bool' to type 'FocusState<Bool>.Binding'
.
Parent view:
struct ParentView: View {
@State private var text: String
@FocusState private var isEditing: Bool
var body: some View {
ChildView($text, $isEditing)
}
}
struct ChildView: View {
@Binding var text: String
var isEditing: FocusState<Bool>.Binding
init(_ text: Binding<String>, _ isEditing: FocusState<Bool>.Binding) {
self._text = text
self.isEditing = isEditing
}
var body: some View {
TextField("Username", text: $text)
.focused(isEditing)
Button("Click me!") {
isEditing = false // Error here
}
}
}
Just assign via binding to wrapped value, like
Button("Click me!") {
isEditing.wrappedValue = false // << here !!
}
With iOS 15.0+, you can use FocusState.Binding
in order to pass your focus state to your child view.
The code snippet below shows how to implement it:
struct ParentView: View {
@State private var text = ""
@FocusState private var isEditing: Bool
var body: some View {
ChildView(text: $text, isEditing: $isEditing)
.onChange(of: isEditing) { oldValue, newValue in
print(newValue) // Track the changes of focus state
}
}
}
struct ChildView: View {
@Binding var text: String
@FocusState.Binding var isEditing: Bool
var body: some View {
TextField("Username", text: $text)
.focused($isEditing)
Button("Click me!") {
isEditing = false
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With