如何在SwiftUI中有条件地加载应用程序启动时的视图



我目前正在尝试使用UserDefaults实现应用程序的自动登录功能。在加载任何视图之前,我想做的是获取UserDefaults电子邮件和密码,并从我的API调用登录函数。如果成功,请转到主视图,否则转到登录视图。我很抱歉,我是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()
}
}
}

这里有一个简单的方法,您可以在Appear上执行此操作


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()) }

}

最新更新