Estoy pasando un binding de Person de la primera vista a la segunda vista a la tercera vista, cuando actualizo el valor de binding en la tercera vista, aparece de nuevo en la segunda vista, entiendo que SwiftUI actualiza las vistas que dependen del valor del estado , pero ¿abrir la vista actual es el comportamiento esperado o estoy haciendo algo mal?
struct Person: Identifiable { let id = UUID() var name: String var numbers = [1, 2] } struct FirstView: View { @State private var people = [Person(name: "Current Name")] var body: some View { NavigationView { List($people) { $person in NavigationLink(destination: SecondView(person: $person)) { Text(person.name) } } } } } struct SecondView: View { @Binding var person: Person var body: some View { Form { NavigationLink(destination: ThirdView(person: $person)) { Text("Update Info") } } } } struct ThirdView: View { @Binding var person: Person var body: some View { Form { Button(action: { person.numbers.append(3) }) { Text("Append a new number") } } } }SwiftUI funciona actualizando las vistas renderizadas para que coincidan con lo que tiene en su estado.
En este caso, primero tiene una lista que contiene un elemento llamado Current Name . Con un enlace de NavigationLink , selecciona este elemento.
Actualizas el nombre y ahora que el elemento anterior ya no existe, ha sido reemplazado por un nuevo elemento llamado New Name .
Dado que el Current Name ya no existe, tampoco se puede seleccionar más y la vista vuelve a aparecer en la lista.
Para poder editar el nombre sin volver a aparecer, deberá asegurarse de que el elemento de la lista sea el mismo, incluso si el nombre ha cambiado. Puede hacer esto usando una struct Identifiable en lugar de una String .
struct Person: Identifiable { let id = UUID().uuidString var name = "Current Name" } struct ParentView: View { @State private var people = [Person()] var body: some View { NavigationView { List($people) { $person in NavigationLink(destination: ChildView(person: $person)) { Text(person.name) } } } } } struct ChildView: View { @Binding var person: Person var body: some View { Button(action: { person.name = "New Name" }) { Text("Update Name") } } }Al navegar dos veces, debe usar isDetailLink(false) o StackNavigationViewStyle , por ejemplo
struct FirstView: View { @State private var people = [Person(name: "Current Name")] var body: some View { NavigationView { List($people) { $person in NavigationLink(destination: SecondView(person: $person)) { Text(person.name) } .isDetailLink(false) // option 1 } } .navigationViewStyle(.stack) // option 2 } }