ios - 如何在 SwiftUI 中启动应用程序时有条件地加载视图?
问题描述
我目前正在尝试使用 UserDefaults 为我的应用程序实现自动登录功能。在加载任何视图之前,我想做的是获取 UserDefaults 电子邮件和密码,并从我的 API 调用登录函数。如果成功,转到 Home 视图,否则转到 LoginView。抱歉,我对 Swift 很陌生,而且我的项目时间紧迫。这是我的代码段。我不确定在哪里可以添加我的逻辑:
import SwiftUI
@main
struct MyApp: App {
init() {
let email = UserDefaults.standard.string(forKey: "email");
let pw = UserDefaults.standard.string(forKey: "pw");
let api = MyAppAPI()
api.signInUser(email: email, password: pw) { result in
//JSON response contains an 'isError' field
let isError = result.value(forKey: "error") as! Bool
if !isError {
//successful login - what to do from here?
}
}
}
var body: some Scene {
WindowGroup {
LoginView()
}
}
}
解决方案
这是执行此操作的简单方法,您可以执行此操作 onAppear
import SwiftUI
struct ContentView: View {
let email: String
let pass: String
init() {
self.email = UserDefaults.standard.string(forKey: "email") ?? ""
self.pass = UserDefaults.standard.string(forKey: "pw") ?? ""
}
@State private var result: Bool?
var body: some View {
Group {
if let unwrappedResult: Bool = result {
if unwrappedResult {
Text("Home View, Welcome!")
}
else {
Text("Wrong User or Pass, try again!")
}
}
else {
Text("loading...")
}
}
.onAppear() { loginFunction(email: email, pass: pass) { value in result = value } }
}
}
func loginFunction(email: String, pass: String, completion: @escaping (Bool) -> Void) {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.milliseconds(3000)) { completion(Bool.random()) }
}
推荐阅读
- sql-server - AWS DMS(数据库迁移服务)SQL Server 到 SQL Server 不复制更改
- php - hasManyThrough 3 个表
- firebase - Firebase 实时数据库已删除
- google-sheets - 谷歌表格饼图
- apache-pulsar - 如何使用 Apache Pulsar 进行有序批处理
- python - 在 for 循环中调用变量以创建列表(使用 np.sin/np.cos)
- mysql - 如何更改/创建表格以支持花哨的文本(unicode)
- python - 可以将单个单词'string'转换为同名字典吗
- ios - 如何在目标C中的类之间传递值?
- python - 如何为 sys.stdin 分配特定值?