23

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
        }
    }
}
Sunderam Dubey
  • 1
  • 11
  • 20
  • 40
Kyle Horkley
  • 911
  • 1
  • 9
  • 23

1 Answers1

15

Just assign via binding to wrapped value, like

Button("Click me!") {
    isEditing.wrappedValue = false  // << here !!
}
aheze
  • 24,434
  • 8
  • 68
  • 125
Asperi
  • 228,894
  • 20
  • 464
  • 690
  • Works! Is there any way I can have isEditing only appear for that particular `TextField`? When I have multiple ChildViews and tap one it triggers it on every item, not just the one in focus. – Kyle Horkley Oct 23 '21 at 06:13
  • 1
    Disregard my last comment, I was able to achieve this with the `equals:` focused parameter – Kyle Horkley Oct 23 '21 at 21:07