使用ObservedObject在多页面间共享数据

2个月前 166次点击 来自 iOS

参考链接:Sharing SwiftUI state with @ObservedObject

在文章 属性包装器@Environment、@EnvironmentObject、@ObservedObject和@State、@Binding 介绍了各种装饰器的使用,其中@ObservedObject是笔者使用最多的装饰器。

首先有以下代码,TextField中输入值同时更新user相应属性值:

class User {
    var firstName = "Bilbo"
    var lastName = "Baggins"
}

struct ContentView: View {
    @State private var user = User()

    var body: some View {
        VStack {
            Text("Your name is \(user.firstName) \(user.lastName).")

            TextField("First name", text: $user.firstName)
            TextField("Last name", text: $user.lastName)
        }
    }
}

以上代码并不能如愿运行,因为@State 只能跟踪本地Struct结构体,而上例中User是一个外部类。

解决方案就是使用ObservableObject@ObservedObject

User类继承ObservableObject,并使用@Published 装饰相应属性:

class User: ObservableObject {
    @Published var firstName = "Bilbo"
    @Published var lastName = "Baggins"
}

使用@ObservedObject 替换@State:

@ObservedObject var user = User()

引用原文改造三部曲:

  • Make a class that conforms to the ObservableObject protocol.
  • Mark some properties with @Published so that any views using the class get updated when they change.
  • Create an instance of our class using the @ObservedObject property wrapper.

改造的逻辑非常直白,就是使用标记更高权限的装饰器提升了数据流共享范围,@State -> @ObservedObject

Card image cap
开发者雷

尘世间一个小小的开发者,每天增加一些无聊的知识,就不会无聊了

要加油~~~

技术文档 >> 系列应用 >>
热推应用
Let'sLearnSwift
学习Swift的入门教程
PyPie
Python is as good as Pie
标签