gpt4 book ai didi

ios - http请求登录成功后直接进入swiftUI中的新 View

转载 作者:行者123 更新时间:2023-12-05 06:05:03 24 4
gpt4 key购买 nike

我一直在使用 php 和 mysql 数据库创建一个简单的用户注册和登录系统。登录 php 文件有效,我已将其连接到我在 Xcode 中的项目。但是,我不太确定如何确保此功能在单击登录按钮时运行,并且仅在登录成功后才移动到下一个 View 。

这是我的快速代码:

import SwiftUI


struct loginview_Previews: PreviewProvider {
static var previews: some View {
loginview()
}
}

struct loginview: View {

// variables and fields

@State private var username : String = ""
@State private var password : String = ""

let databaseurl = "http://localhost/login.php"

var body: some View {

// put into a navigation view

NavigationView{

// form to enter details

Form{

// start section with a header for info

Section(header: Text("enter your details to log in !")){

// username field

TextField("username", text: $username)

.font(.headline)
.frame(width: 350.0)
.foregroundColor(.white)
.padding(.all, 20.0)
.cornerRadius(9.0)
.preferredColorScheme(.dark)

TextField("password", text: $password)

.font(.headline)
.frame(width: 350.0)
.foregroundColor(.white)
.padding(.all, 20.0)
.cornerRadius(9.0)
.preferredColorScheme(.dark)

} .textCase(nil) // make header lowercase

Section{
NavigationLink(destination: homepage()){ // link to home page view

Text("submit")

.foregroundColor(.white)
.fontWeight(.heavy)
.font(.system(size: 22))
.padding(.all, 20.0)
.frame(width: 175.0)
.preferredColorScheme(.dark)

}
}

// button is unclickable if textfields are empty

.disabled(username.isEmpty)
.disabled(password.isEmpty)
}

.navigationBarTitle("log in") // title of form
}
}

//

func logindatabase(){

// create NSURL - an object initialized with URLString

if var requesturl = URLComponents(string: databaseurl) {

requesturl.query = "username=\(username)&password=\(password)"
print(requesturl)

guard let url = requesturl.url else { return }

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


if error != nil {
print("error is \(String(describing: error))")
return
}

// parse the response

do {
// convert response to NSDictionary

let myJSON = try JSONSerialization.jsonObject(with: data! , options: .mutableContainers) as? NSDictionary

if let parseJSON = myJSON {
// create a string & get the json response

guard let message = parseJSON["message"] as? String else { return }

// print the response

print(message)

}

} catch {
print(error)
}
}
task.resume()
}

}
}

这是我的 login.php 文件:

<?php

//include the db operation file
require_once 'dboperations.php' ;

// create a response array
$response = array();

if ($_SERVER['REQUEST_METHOD'] == 'GET') {

if (isset($_GET['username']) && isset($_GET['password'])) {

$db = new dboperation();

if ($db->userlogin($_GET['username'], $_GET['password'])) {
$response['error'] = false;
$response['user'] = $db->displayuser($_GET['username']);
} else {
$response['error'] = true;
$response['message'] = 'invalid username or password';
}

} else {
$response['error'] = true;
$response['message'] = 'parameters are missing';
}

} else {
$response['error'] = true;
$response['message'] = "Request not allowed";
}

echo json_encode($response);

确实成功了。

最佳答案

这是您所说内容的一个非常简单的版本:

class LoginManager : ObservableObject {
@Published var isLoggedIn = false

func doLogin(username: String, password: String) {
//in here, you'll do your network call
//I've mocked it with a simple async call for now
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
//set this once you get the correct response from your server
//this triggers isActive on the NavigationLink below
self.isLoggedIn = true
}
}
}

struct ContentView : View {
@ObservedObject private var loginManager = LoginManager()

@State var username = ""
@State var password = ""

var body: some View {
NavigationView {
Button(action: {
loginManager.doLogin(username: username, password: password)
}) {
//Login fields...
Text("Log me in")
}.overlay(
NavigationLink(destination: LoggedInView(), isActive: $loginManager.isLoggedIn) {
EmptyView()
}
)
}
}
}

struct LoggedInView : View {
var body: some View {
Text("Logged in")
}
}

请注意,我使用的是 Button 而不是 NavigationLink 作为初始操作。然后,调用一个名为 doLogin 的函数,它是一个 @Published 属性,表示用户是否已登录。

如果 isLoggedIn 为真,则触发 NavigationLink 上的 isActive,将用户发送到下一个 View 。

一些需要考虑的事情:

  1. 在现实世界中,您永远不应该通过 GET 请求发送用户名/密码——这太不安全了
  2. 如果您不希望用户只能使用 Back 按钮返回初始登录屏幕,您实际上可能不想使用 NavigationLink - 您可能只想有条件地显示一个 View :
if loginManager.isLoggedIn {
LoggedInView()
} else {
LoginForm()
}

关于ios - http请求登录成功后直接进入swiftUI中的新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66107887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com