ios - 如何在多页面 SwiftUI 用户注册之间传递用户输入数据?
问题描述
考虑一个 iOS SwiftUi 应用程序,该应用程序共有 3 个页面用于用户注册过程。
- 包含电子邮件输入和继续按钮的第一页
- 第二页包含用户名输入和继续按钮
- 第三页包含密码输入和注册按钮
捕获用户输入数据然后将其发送到后端的最佳实践是什么?
我最初的假设是将用户在第 1 页和第 2 页中输入的数据存储在本地。然后点击第 3 页上的注册按钮,获取先前本地存储的数据以及第 3 页数据,并将其作为一个发送到后端。然后清除本地存储。
其他想法是使用@EnvironmentObject 来存储用户输入,但这安全/推荐吗?
解决方案
这里没有真正正确的答案,但我们可以从 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 的发布者来定义哪些存储子状态更改应该影响组件来优化存储连接的组件:
推荐阅读
- python - 如何根据位置值拆分列表元素
- javascript - 如何在反应中将新的 HTML 元素推送到现有的父元素?
- version-control - TortoiseGit 没有克隆存储库的选项
- java - 手动定义容器且未使用侦听器注释时如何在spring-kafka中暂停/恢复消费者
- matlab - 如何添加两个坐标已移动的矩阵
- c# - 创建在 com 接口中定义的对象类型的数组
- python - 输入搜索不匹配时添加到列表中的“无”
- c# - C# - 使用 LDAP 检索 Active Directory 的组成员
- android - 最新的 Windows 更新后,Windows 是否在运行 Android 模拟器时崩溃?
- r - PCA 载荷结果的相同值