如何在多页面SwiftUI用户注册之间传递用户输入数据?

时间:2019-12-19 21:44:48

标签: ios swiftui

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

  • 第一页包含电子邮件输入和继续按钮
  • 第二页,其中包含用户名输入和继续按钮
  • 包含密码输入和注册按钮的第三页

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

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

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

1 个答案:

答案 0 :(得分:1)

这里确实没有一个正确的答案,但是我们可以向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。在这种方法中,通过触发动作并在化简器功能中修改状态,使存储的变异与存储的状态分离。您可以在此处看到一个通过SwiftUI方式并结合使用Redux的酷示例:

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

还可以通过以下方法来了解它如何通过使用特定于KeyPath的发布者来定义哪些商店子状态更改应影响组件的方式来优化与商店相关的组件:

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