Skip to main content

How to send state updates manually using objectWillChange

About 2 minSwiftSwiftUIArticle(s)bloghackingwithswift.comcrashcourseswiftswiftuixcodeappstore

How to send state updates manually using objectWillChange 관련

SwiftUI by Example

Back to Home

How to send state updates manually using objectWillChange | SwiftUI by Example

How to send state updates manually using objectWillChange

Updated for Xcode 15

Although using @Published is the easiest way to control state updates, you can also do it by hand if you need something specific. For example, you might want the view to refresh only if you're happy with the values you've been given.

All observable objects automatically get access to an objectWillChange property, which itself has a send() method we can call whenever we want observing views to refresh.

For example:

// Create an observable object class that announces 
// changes to its only property
class UserAuthentication: ObservableObject {
    var username = "Taylor" {
        willSet {
            objectWillChange.send()
        }
    }
}

struct ContentView: View {
    // Create an instance of our object
    @StateObject var user = UserAuthentication()

    var body: some View {
        VStack(alignment: .leading) {
            TextField("Enter your name", text: $user.username)
            Text("Your username is: \(user.username)")
        }
    }
}

Download this as an Xcode projectopen in new window

Notice how we have a willSet property observer attached to the username property of UserAuthentication, allowing us to run code whenever that value changes. In our example code, we call objectWillChange.send() whenever username changes, which is what tells the objectWillChange publisher to put out the news that our data has changed so that any subscribed views can refresh.

Tips

This example is no different from using @Published on the property, but now that we have a custom call to objectWillChange.send() we can add extra functionality – we could save the value to disk, for example.

Similar solutions…
What's the difference between @ObservedObject, @State, and @EnvironmentObject? | SwiftUI by Example

What's the difference between @ObservedObject, @State, and @EnvironmentObject?
How to run some code when state changes using onChange() | SwiftUI by Example

How to run some code when state changes using onChange()
How to use @ObservedObject to manage state from external objects | SwiftUI by Example

How to use @ObservedObject to manage state from external objects
How to fix “Modifying state during view update, this will cause undefined behavior” | SwiftUI by Example

How to fix “Modifying state during view update, this will cause undefined behavior”
Working with state | SwiftUI by Example

Working with state

이찬희 (MarkiiimarK)
Never Stop Learning.