我在Xcode中使用Swift编程相当新,所以我最近关注了位于http://swiftdeveloperblog.com/store-user-information-in-mysql-database/的Sergey Kargopolov的精彩php sql注册教程。
不幸的是,该教程略显过时,需要针对Swift 2.0进行更新。我设法通过实现do / catch语句来替换有问题的代码,这似乎很有效,除非我收到来自服务器端php脚本的响应,我似乎无法根据结果导航到不同的视图控制器。例如,如果响应是"注册成功"用户被定向到受保护的页面,但是如果数据库中已经存在电子邮件地址,我希望它保持在同一页面上。
目前我的代码工作到警报出现的位置(用户已经存在或成功)但是当用户点击"确定"时,无论结果如何,都会将它们定向到受保护的页面。我想这将是一个简单的例子,告诉它根据这个结果进入下一个视图" if"语句:
if (resultValue == "Success") {
isUserRegistered = true
let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
self.presentViewController(next, animated: true, completion: nil)
}
但它似乎不起作用。希望我能做的事情很有意义,非常感谢任何帮助。
这是我的代码:
let myUrl = NSURL(string: "http://localhost/PhpProject1/scripts/registerUser.php")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let postString = "userEmail=\(userEmail!)&userFirstName=\(userFirstName)&userLastName=\(userLastName)&userPassword=\(userPassword!)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
if let parseJSON = json {
var resultValue = parseJSON["status"] as! String!
print("result: \(resultValue)")
var isUserRegistered: Bool = false
if (resultValue == "Success") {
isUserRegistered = true
}
var messageToDisplay: String = parseJSON["message"] as! String!
if (!isUserRegistered)
{
messageToDisplay = parseJSON["message"] as! String!
}
dispatch_async(dispatch_get_main_queue(), {
var myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.Alert)
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default) { action in
// self.dismissViewControllerAnimated(true, completion: nil)
let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
self.presentViewController(next, animated: true, completion: nil)
}
myAlert.addAction(okAction)
}
)}
} catch { print(error)}
}
task.resume()
}
func displayAlertMessage(userMessage:String) {
let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.Alert);
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)
myAlert.addAction(okAction);
self.presentViewController(myAlert, animated: true, completion: nil)
}
}
我还应该补充一点,当用户注册成功时,我得到"结果:200"在输出窗口中但是当用户电子邮件已经存在时,我得到"结果:400"。我只是不知道如何利用这一点。
提前致谢!
答案 0 :(得分:0)
从我从JSON响应中可以看到,parseJSON["status"]
是HTTP statusCode,它是一个数字状态代码。 200是成功,400是坏请求,404是未找到,500是错误。
您可以从字典中读取消息,也可以根据PHP代码的工作方式将状态转换为整数,并且只有在状态为200时才会生效。对于任何其他状态代码,您可能希望显示消息给用户。
这取决于您是否故意根据结果返回状态代码,例如状态代码401为un-authorised。
正确使用状态代码比比较字符串更可靠。
编辑:
import Foundation
let jsonData = "{ \"message\": \"Successfully registered new user\", \"status\": 200, \"userEmail\": \"abc\", \"userFirstName\": \"a\", \"userId\": 22, \"userLastName\": \"a\" }".dataUsingEncoding(NSUTF8StringEncoding)
do {
let json = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: .MutableContainers) as? NSDictionary
if let parseJSON = json {
let statusCode = parseJSON["status"] as! Int
switch statusCode {
case 200:
print("successfully logged in")
case 400, 401:
print("access denied")
default:
print("error occurred")
}
}
}
上面,我添加了一个如何在Swift中处理此问题的示例,您只需根据要处理的statusCodes以及如何更改行为
答案 1 :(得分:0)
嗯,我熬了一会儿,多亏了你的脚本,我能够弄清楚。
基本上我所做的只是创建一个新变量:
var statuscheck: Int!
然后在“if let parseJSON = json {”语句之后我将“status”作为Int转换为:
self.statuscheck = (parseJSON["status"]! as! NSString).integerValue
然后在“dispatch_async(dispatch_get_main_queue()”下面的行之后:
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default) { action in
我做了检查:
if (self.statuscheck == 200) {
let next = self.storyboard?.instantiateViewControllerWithIdentifier("ProtectedViewController") as! ProtectedViewController
self.presentViewController(next, animated: true, completion: nil)
}
现在看起来效果很好。
再次感谢您的所有帮助脚本。你的确指出了我正确的方向!