快速UI切换视图

问题描述 投票:0回答:1

在下面的源代码中,我尝试在按钮中的方法成功后更改视图,但是它不起作用。我希望有人可以阅读我的代码并为我提供帮助。

import SwiftUI

struct AppRootView: View {

    @State var signedIn: Bool = false

    var body: some View {

        Group{
            if(signedIn){
                HomeView()
            } else {
                Login()
            }
        }
    }

}

struct ContentView: View {
    var body: some View {


        Login()

    }
}


struct HomeView: View {
    var body: some View {
    Text("test")
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}



struct Login : View {

    @State var user = ""
    @State var pass = ""

    @Binding var signedIn: Bool


    var body : some View {



        VStack{

            /*Group {
                       if (signedIn) {
                           HomeView()
                       } else {
                           Login()
                       }
                   }*/

            Image("logo")
                .resizable()
                .frame(width: 100, height: 100)

            Text("Sign In").fontWeight(.heavy).font(.largeTitle).foregroundColor(Color("Iso-Blue")).padding([.top,.bottom], 20)

            VStack(alignment: .leading){

                VStack(alignment: .leading){

                    Text("Username").font(.headline).fontWeight(.light)

                    HStack{

                        TextField("Enter Your Username", text: $user)


                    }

                    Divider()

                }

                VStack(alignment: .leading){

                    Text("Password").font(.headline).fontWeight(.light)


                        SecureField("Enter Your Password", text: $pass)

                        Divider()

                }




            }.padding(.horizontal, 6)

             VStack{

                /*if (signedIn == true) {
                    HomeView()
                } else {
                    Login()
                }*/

                 Button(action: {

                             let url = URL(string: "http://192.168.178.39/iso/loginserv.php")
                             guard let requestUrl = url else { fatalError() }

                             var request = URLRequest(url: requestUrl)
                             request.httpMethod = "POST"

                            let postString = "user=\(self.user)&pass=\(self.pass)";

                             request.httpBody = postString.data(using: String.Encoding.utf8);

                             let task = URLSession.shared.dataTask(with: request) {
                                 (data, response, error) in

                                 if let error = error {
                                     print("Error took place \(error)")
                                     return
                                 }

                                if let data = data, let dataString = String(data: data, encoding: .utf8) {
                                     print("Response data string:\n \(dataString)")
                                     self.signedIn = true


                                }

                    }

                task.resume()



                }) {
                     Text("Sign In").foregroundColor(.white).frame(width: UIScreen.main.bounds.width - 120).padding()

                 }.background(Color("Iso-Gray"))
                 .clipShape(Capsule())
                 .padding(.top, 45)
             }

        }.padding()  

    }
}

我试图创建变量来检查操作是否成功,但是我不知道。我只希望登录成功后才能显示下一个视图(HomeView())!

swift view
1个回答
0
投票

尝试一下(我必须稍微更改一下代码,因为它不能以您复制的方式运行)

但是它应该起作用。

import SwiftUI

struct AppRootView: View {

    @State var signedIn: Bool = false

    var body: some View {

        Group{
            if(signedIn){
                HomeView()
            } else {
                Login(signedIn: $signedIn)
            }
        }
    }

}

struct ContentView: View {

    @State var signedIn = false

    var body: some View {


        Login(signedIn: $signedIn)

    }
}


struct HomeView: View {
    var body: some View {
        Text("test")
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}



struct Login : View {

    @State var user = ""
    @State var pass = ""

    @Binding var signedIn: Bool


    var body : some View {

        VStack{
            if signedIn {
                HomeView()
            } else {

                /*Group {
                 if (signedIn) {
                 HomeView()
                 } else {
                 Login()
                 }
                 }*/
                Text("Logo")
                Image("logo")
                    .resizable()
                    .frame(width: 100, height: 100)

                Text("Sign In").fontWeight(.heavy).font(.largeTitle).foregroundColor(Color.blue).padding([.top,.bottom], 20)

                VStack(alignment: .leading){

                    VStack(alignment: .leading){

                        Text("Username").font(.headline).fontWeight(.light)

                        HStack{

                            TextField("Enter Your Username", text: $user)
                        }

                        Divider()
                    }

                    VStack(alignment: .leading){

                        Text("Password").font(.headline).fontWeight(.light)


                        SecureField("Enter Your Password", text: $pass)

                        Divider()
                    }
                }.padding(.horizontal, 6)

                VStack{

                    /*if (signedIn == true) {
                     HomeView()
                     } else {
                     Login()
                     }*/

                    Button(action: {

                        let url = URL(string: "http://192.168.178.39/iso/loginserv.php")
                        guard let requestUrl = url else { fatalError() }

                        var request = URLRequest(url: requestUrl)
                        request.httpMethod = "POST"

                        //          let postString = "user=\(self.user)&pass=\(self.pass)";

                        request.httpBody = "user=bla&pass=bla".data(using: String.Encoding.utf8);

                        let task = URLSession.shared.dataTask(with: request) {
                            (data, response, error) in

                            if let error = error {
                                print("Error took place \(error)")
                                return
                            }

                            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                                print("Response data string:\n \(dataString)")
                                self.signedIn = true


                            }

                        }
                        self.signedIn = true

                        task.resume()

                    }) {
                        Text("Sign In").foregroundColor(.white).frame(width: UIScreen.main.bounds.width - 120).padding()

                    }.background(Color.green)
                        .clipShape(Capsule())
                        .padding(.top, 45)
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.