【发布时间】:2016-10-22 08:16:22
【问题描述】:
我正在从 PHP 中将 Array 检索到 Swift 中,其中包含来自几个 SQL 查询的值。
在 Swift 中通过以下代码发送、接收和打印数组:
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
DispatchQueue.main.async
{
let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
print (json)
}
该数组包含 userDetails 和 Communities,它在 Xcode 中的输出(通过打印调试)如下所示:
Optional(["userDetails": {
id = 2;
"user_email" = "radowns82@gmail.com";
"user_name" = "<null>";
}, "communities": <__NSArrayI 0x60000002f500>(
{
name = Gallelio;
},
{
name = GallelioPart2;
}
)
])
Optional(["userDetails": {
id = 30;
"user_email" = "sam.bawdry@gmail.com";
"user_name" = "Samuel Bawdry";
}, "communities": <__NSArrayI 0x60800026e180>(
{
name = TesetTester;
},
{
name = Westbrook2;
},
{
name = WinnersOnly;
},
{
name = OneTwoThree;
},
{
name = WhoopdeWhoop;
}
)
])
我现在如何解压缩“社区”的内容,以便可以在 UITableVIew 中显示其内容 - 我已经设置了 UITableView 并使用了“虚拟数据”。
这是完整的 Swift 脚本:
import UIKit
protocol UsernameSentDelegate {
func userLoggedIn(data: String)
}
class LoginViewController: UIViewController {
var delegate: UsernameSentDelegate? = nil
@IBOutlet weak var userEmailTextField: UITextField!
@IBOutlet weak var userPasswordTextField: UITextField!
@IBOutlet weak var displayUserName: UILabel!
var communitiesArray = [String]()
@IBAction func loginButtonTapped(_ sender: AnyObject)
{
let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;
if (userPassword!.isEmpty || userEmail!.isEmpty) { return; }
// send user data to server side
let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/userLogin.php");
var request = URLRequest(url:myUrl!);
request.httpMethod = "POST";
let postString = "email=\(userEmail!)&password=\(userPassword!)";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
DispatchQueue.main.async
{
if(error != nil)
{
//Display an alert message
let myAlert = UIAlertController(title: "Alert", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert);
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
if let arr = json?["communities"] as? [String:String] {
self.communitiesArray = arr.map { $0["name"] }
}
// retrieve login details and check to see if all ok
if let parseJSON = json {
let returnValue = parseJSON["status"] as? String
if(returnValue != "error")
{
self.delegate?.userLoggedIn(data: userEmail! )
UserDefaults.set(UserDefaults.standard)(true, forKey: "isUserLoggedIn");
self.dismiss(animated: true, completion: nil)
} else {
// display an alert message
let userMessage = parseJSON["message"] as? 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.present(myAlert, animated: true, completion: nil)
}
}
} catch
{
print(error)
}
}
}
task.resume()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "loginView" {
let createViewController: ViewController = segue.destination as! ViewController
createViewController.communities = communitiesBox
print (communitiesBox)
}
}
}
【问题讨论】:
-
if let communities = json["communities"] as Array<Dictionary<String, Any>> { //you have communities as Array and load it using table view methods... }
标签: arrays json swift uitableview swift3