首页 > 解决方案 > 如何在多页面 SwiftUI 用户注册之间传递用户输入数据?

问题描述

考虑一个 iOS SwiftUi 应用程序,该应用程序共有 3 个页面用于用户注册过程。

捕获用户输入数据然后将其发送到后端的最佳实践是什么?

我最初的假设是将用户在第 1 页和第 2 页中输入的数据存储在本地。然后点击第 3 页上的注册按钮,获取先前本地存储的数据以及第 3 页数据,并将其作为一个发送到后端。然后清除本地存储。

其他想法是使用@EnvironmentObject 来存储用户输入,但这安全/推荐吗?

标签: iosswiftui

解决方案


这里没有真正正确的答案,但我们可以从 React 世界中寻找灵感,因为 SwiftUI 很大程度上基于 React。变得流行的方法是创建一个单一的事实来源,即一个存放您共享状态的单一“存储”。

怎么和店家沟通?最简单的方法是创建一个类,在 AppDelegate 中实例化该类并将实例传递到视图层次结构中。您可以将其作为属性显式传递给每个视图,也可以使用 SwiftUI 的 EnvironmentObject 隐式传递。

这是一个简单的商店的样子:

class AppState: ObservableObject {
  @Published var firstName: String?
  @Published var lastName: String?

  func submit() {
    // submit first and last name to the API
  }
}

一个类似但更健壮的实现是使用一种非常流行的模式,称为 Redux。在这种方法中,通过触发动作和修改 reducer 函数中的状态,改变 store 与 store 的状态分离。您可以在此处看到一个使用 Combine 以 SwiftUI 方式实现 Redux 的酷示例:

https://swiftwithmajid.com/2019/09/18/redux-like-state-container-in-swiftui/

还可以查看这种方法,了解它如何通过使用特定于 KeyPath 的发布者来定义哪些存储子状态更改应该影响组件来优化存储连接的组件:

https://nalexn.github.io/swiftui-observableobject


推荐阅读