2016-10-22 14 views
0

いくつかのSQLクエリの値を含むPHPからSwiftにArrayを取得しています。PHPから配列をSwiftにJSON経由で展開する方法

アレイ用に送られ、コードに従って、スイフトで受信して印刷:

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) 
} 

をアレイuserDetailsCommunitiesが含まとXcode(プリントデバッグを介して)その出力は次のようになります。

Optional(["userDetails": { 
id = 2; 
"user_email" = "[email protected]"; 
"user_name" = "<null>"; 
}, "communities": <__NSArrayI 0x60000002f500>(
{ 
name = Gallelio; 
}, 
{ 
name = GallelioPart2; 
} 
) 
]) 
Optional(["userDetails": { 
id = 30; 
"user_email" = "[email protected]"; 
"user_name" = "Samuel Bawdry"; 
}, "communities": <__NSArrayI 0x60800026e180>(
{ 
name = TesetTester; 
}, 
{ 
name = Westbrook2; 
}, 
{ 
name = WinnersOnly; 
}, 
{ 
name = OneTwoThree; 
}, 
{ 
name = WhoopdeWhoop; 
} 
) 
]) 

「コミュニティ」の内容を開梱して、内容をUITableVIewに表示するにはどうすればいいですか?UITableViewは既に設定されていて、「ダミーデータ」を使用しています。

これは、フルスウィフトスクリプトです:

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) 
    } 


} 



} 
+0

cell.label.text = self.communitiesArray[indexPath.row]のように '場合は聞かせて社会= JSON [ "コミュニティ"] <辞書> {//あなたは、Arrayなどのコミュニティを持っているし、テーブルビューを使用して、それをロードメソッド...} ' –

+0

https://www.raywenderlich.com/120442/swift-json-tutorial私はそれがあなたの役に立つと思う – seggy

答えて

2

次の2つの方法を使用していることを行ってすることができます。

Arrayを1つ宣言し、TableViewでそれを使用してください。

tableView方法で今
var communitiesArray = [[String:String]]() 

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

    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
    if let arr = json["communities"] as? [[String:String]] { 
     self.communitiesArray = arr 
    }  
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

はあなたcommunitiesでのみname値を取得している場合、それはあなたがこのようなタイプ[String]だけの配列を作成した場合は打者である

cell.label.text = self.communitiesArray[indexPath.row]["name"]よう communitiesArrayを使用して設定します。アレイとして

var communitiesArray = [String]() 

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

    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
    if let arr = json["communities"] as? [[String:String]] { 
     self.communitiesArray = arr.flatMap { $0["name"]} 
    }  
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

tableView方法、設定された使用communitiesArray

+0

「タイプ(キー:文字列、値:文字列)」エラーが発生しています下のメンバーはいません。selfcommunitiesArray = arr.map ...という行には、「json?」コミュニティを置くことが強制されました。それは正しいのですか? – RDowns

+0

優秀!追加のxCodeは(? jsonの後、! ["name"]の後に、それはうまくいくように見えます!乾杯 – RDowns

関連する問題