我正在嘗試讓用戶進入 ContentView 并登錄,現在這將讓他們登錄或回傳 ContentView(稍后會因登錄失敗而創建錯誤和事情)。目前我可以登錄并從我的 API 中提取所需的資料,然后如果它們成功,它將運行條件 true 或 false 如果它們不成功。在條件陳述句中是一個列印陳述句,如果為真則為成功,如果為假則為不成功。這一切都運行良好,但是當我放入一個陳述句來更改視圖時,它不會更改視圖。我確定它與 async/await 有關,但我對 SwiftUI 還很陌生。我已經包含了 ContentView 代碼以供參考。這不是一個超級復雜的程序,但我似乎找不到關于以這種方式改變視圖的很多資訊。這可能是錯誤的方法,所以任何建議都會很棒。
import SwiftUI
struct ContentView: View {
@State var username : String = ""
@State var password : String = ""
@State var loggedIn : Bool = false
@State var network = NetworkCall()
var body: some View {
ZStack {
Color(red: 0.4627, green: 0.8392, blue: 1.0).ignoresSafeArea()
VStack {
Text("Login")
.padding()
TextField("Username", text: $username)
.padding()
SecureField("Password", text: $password)
.padding()
Button(action: {
Task {
do{
try await loggedIn = network.LoginFunction(userName: username, passWord: password)
if(loggedIn){
print("Login Successful")
Dashboard()
}
else {
print("Login Unsuccessful")
ContentView()
}
}catch{
print("error", error)
}
}
}) {
Text("Sign in")
.padding()
.frame(minWidth: 100, maxWidth: 300, minHeight: 44)
.foregroundColor(Color.white)
.cornerRadius(30)
.background(Color.blue)
.cornerRadius(20)
}
}
}
}
}
網路來電者
import Foundation
class NetworkCall {
func LoginFunction(userName: String, passWord: String) async throws -> Bool {
let parameters = "{\r\n \"uEmail\" : \"" userName " \",\r\n \"uPassword\" : \"" passWord "\" \r\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "https://..........................")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let (data, response) = try await URLSession.shared.data(for: request)
guard (response as? HTTPURLResponse)?.statusCode == 200 else { fatalError("Error while fetching data") }
let decodedUser = try JSONDecoder().decode(UserClass.self, from: data)
print(decodedUser.userinfo.user_guid)
if(decodedUser.status){
return true
}
else{
return false
}
}
}
uj5u.com熱心網友回復:
SwiftUI 呈現您的用戶界面以回應狀態的變化。因此,與其嘗試渲染Dashboard或ContentView在您的 中Task,您需要設定某種形式的狀態更高,以確定向用戶顯示哪個視圖。
例如,如果您有一個@State變數記錄您的登錄狀態,您的代碼將開始看起來像
struct ContentView: View {
@State var loggedIn = false
var body: some View {
if loggedIn {
Dashboard()
} else {
// login form
Button {
Task {
let logInStatus = try await network.LoginFunction(userName: username, passWord: password)
self.loggedIn = logInStatus
}
}
}
}
}
當您的async任務更改 ContentView 的狀態時,SwiftUI 的渲染子系統將選取loggedIn已更改的狀態,并重新渲染,body以便登錄表單被對Dashboard().
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359284.html
