I want to get user input (using TextField
) from one view and show it (the text which the user entered) in another view.
Here's a minimal, reproducible example
I created an ObservableObject
named UserData
import Foundation
import SwiftUI
import Combine
class UserData: ObservableObject {
@Published var name: String = ""
}
Then I created a view named Edit
with a TextField
where user can enter a text
import SwiftUI
struct Edit: View {
@ObservedObject var userData = UserData()
var body: some View {
VStack {
TextField("Enter Name", text: $userData.name)
}
}
}
And here's the ContentView
, the root view where I want to show the text which the user entered (initially, the text is empty).
import SwiftUI
struct ContentView: View {
@State var isPresented = false
@ObservedObject var userData = UserData()
var body: some View {
VStack {
Text(self.userData.name)
.font(.largeTitle)
Button(action: { self.isPresented.toggle() }) {
Text("Click me to Edit")
}
.sheet(isPresented: $isPresented) {
Edit()
}
}
}
}
When we click the button in the ContentView
, a sheet is presented with Edit
view
When I click that button, a sheet with Edit
view shows up ✅.
Then I can enter a text using the TextField
✅.
But when I dismiss the sheet by dragging down, the Text
in the ContentView
is still empty 🙁.
As I know, $userData.name
updates when ever I enter something in the TextField
.
But a Text
in another view with a binding self.userData.name
is not going to reflect the updated value 😫.
Is there any way to update the Text
when we dismiss the sheet or is there any other way to do this?
Please help me.
Thanks for reading my question 😊
Your Edit
view and ContentView
are each holding separate UserData
objects. They don't share references to a single object, so editing one of them isn't updating the other.
First update your Edit
view so it doesn't initialize its own UserData
object:
@ObservedObject var userData: UserData
Then, in your ContentView
, pass a reference to your single canonical UserData
object into the Edit
view:
.sheet(isPresented: $isPresented) {
Edit(userData: self.userData)
}
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