【发布时间】:2021-07-16 10:15:52
【问题描述】:
我正在努力让一些基本代码正常工作,以使我能够更改 Swiftui 项目中的视图。
我有 3 个视图:我的默认 ContentView、一个登录屏幕和一个主菜单。
项目加载到只是一个徽标的 ContentView。我有一个默认为 false 的布尔值和一个加载登录屏幕或主菜单的扩展函数,具体取决于该布尔值。
这部分工作正常,项目加载,我看到登录页面。登录按钮调用一个执行 URLsession 的函数,并根据返回的值将布尔标志设置为 true 或在登录失败的情况下将其保留为 false。
我正在努力获得改变视图的功能。我可以很好地切换函数中的布尔标志,但是如果我包含诸如 MainMenu() 之类的语句来加载我的主菜单视图,则什么也不会发生。
我已经尝试过使用可观察对象和“订阅者”来尝试使其正常工作,但我不确定这是否真的需要,而且我不喜欢让它工作。
非常感谢任何帮助
完整代码:
import SwiftUI
var isLoggedin = false
var authenticationFailure = false
func DoLogin(username: inout String, password: inout String){
print(isLoggedin)
let url = URL(string: "https://www.example.com/mobile/ios/test.php")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let parameters: [String: Any] = [
"username": username,
"password": password]
request.httpBody = parameters.percentEncoded()
let task = URLSession.shared.dataTask(with: request) { data,response,error in
guard let data = data,
let response = response as? HTTPURLResponse,
error == nil else{
print("error", error ?? "Unknown error")
return
}
guard (200 ... 299) ~= response.statusCode else {
print("statuscode should be 2xx, got \(response.statusCode)")
print("response = \(response)")
return
}
let responseString = String(data: data, encoding: .utf8)
if responseString == "1"{
print("Logged in")
isLoggedin = true
print(isLoggedin)
MainMenu()
}
else{
print("NO LOGIN")
isLoggedin = false
}
}
task.resume()
}
extension View {
@ViewBuilder func changeView(_ isLoggedin: Bool) -> some View {
switch isLoggedin {
case false: LoginView()
case true: MainMenu()
}
}
}
struct ContentView: View {
@State var isLoggedin = false
var body: some View {
Color.clear
.changeView(isLoggedin)
VStack{
Image("logo")
.padding(.bottom, 40)
}
}
}
struct LoginView: View {
@State var username: String = ""
@State var password: String = ""
@State var isLoggedin = false
var body: some View {
VStack{
Form{
TextField("Username: ", text:$username)
.frame(maxWidth: .infinity, alignment: .center)
.autocapitalization(.none)
SecureField("Password: ",text:$password)
Button("Login"){
DoLogin(username: &username, password: &password)
}
}
.padding(.top, 100)
}
}
}
struct MainMenu: View{
@State var isLoggedin = true
var body: some View{
VStack{
Text("Main Menu")
}
}
}
/*struct ContentView_Previews: PreviewProvider {
static var previews: some View {
/*ContentView() */
}
}*/
【问题讨论】:
标签: swiftui