返回

SwiftUI 属性包装器系列 --- @StateObject @ObservedObject @Published 的应用

iOS

使用 SwiftUI 属性包装器构建响应式用户界面

前言

SwiftUI 作为一种声明式用户界面框架,以其直观语法和强大的属性包装器而闻名。这些包装器让您能够轻松管理视图中的数据和状态,从而创建响应式且动态的用户界面。本文将深入探讨三个关键的 SwiftUI 属性包装器:@StateObject@ObservedObject@Published,并演示如何利用它们构建出色的用户体验。

@StateObject 属性包装器

@StateObject 属性包装器赋予您在视图中创建可观察对象的权力。可观察对象可以在视图中访问,并在其内部状态发生改变时自动触发视图更新。它非常适合管理视图独有的状态,例如表单数据或计时器。

struct MyView: View {
  @StateObject private var viewModel = ViewModel()

  var body: some View {
    Text(viewModel.name)
  }
}

class ViewModel: ObservableObject {
  @Published var name = "John Doe"
}

在这个例子中,@StateObject 属性包装器用于创建一个 ViewModel 实例,它是一个可观察对象,包含一个已发布的属性 name。当 name 发生改变时,MyView 中的文本视图会自动更新。

@ObservedObject 属性包装器

@ObservedObject 属性包装器允许您观察另一个视图的可观察对象。这在多个视图共享相同底层状态的情况下非常有用。

struct MyOtherView: View {
  @ObservedObject private var viewModel: ViewModel

  init(viewModel: ViewModel) {
    self.viewModel = viewModel
  }

  var body: some View {
    Text(viewModel.name)
  }
}

class ViewModel: ObservableObject {
  @Published var name = "John Doe"
}

在这里,@ObservedObject 用于观察来自另一个视图的 ViewModel 实例。当 name 在其他视图中发生改变时,MyOtherView 也会同步更新。

@Published 属性包装器

@Published 属性包装器用于在可观察对象中创建已发布的属性。已发布属性可以在其他视图中被观察,并且在发生改变时触发这些视图的更新。

class ViewModel: ObservableObject {
  @Published var name = "John Doe"
}

在这个例子中,@Published 属性包装器应用于 ViewModel 中的 name 属性。任何观察 name 的视图都会在 name 发生改变时收到通知并更新其 UI。

结论

@StateObject@ObservedObject@Published 属性包装器为创建响应式用户界面提供了强大的工具集。通过管理视图状态并促进视图之间的通信,这些包装器可以帮助您构建动态且易于维护的应用程序。在您的 SwiftUI 开发之旅中,充分利用这些功能,让您的用户享受无缝且引人入胜的体验。

常见问题解答

  1. 什么时候应该使用 @StateObject
    当您需要在单个视图中管理独有状态时,@StateObject 是理想的选择。

  2. @ObservedObject@StateObject 之间有什么区别?
    @StateObject 管理视图的内部状态,而 @ObservedObject 允许您观察其他视图的可观察对象。

  3. 如何使属性成为已发布的?
    使用 @Published 属性包装器,将其添加到可观察对象中。

  4. 为什么使用属性包装器而不是手动更新视图?
    属性包装器提供了简化的方式来管理状态和更新视图,减少了代码重复和错误的可能性。

  5. 这些属性包装器如何提高应用程序性能?
    通过自动更新视图,属性包装器消除了手动状态管理和视图更新的开销,从而提高了应用程序性能。