在下面的源代码中,我尝试在按钮中的方法成功后更改视图,但是它不起作用。我希望有人可以阅读我的代码并为我提供帮助。
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())!
尝试一下(我必须稍微更改一下代码,因为它不能以您复制的方式运行)
但是它应该起作用。
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)
}
}
}
}
}