2015-02-23 4 views
0

Что я хотел бы сделать: Извлечь в свои статические ячейки Ярлыки возврат моего запроса JSON.iOS Swift JSON получение данных выпуск

В чем моя проблема: Я не могу этого сделать. Невозможно вернуть одно значение для изменения моей метки.

Что я попробовал: Прежде всего, я устанавливаю библиотеку Alamofire и SwiftyJSON. Во-вторых, я сделал свой PHP-скрипт, который приводит к правильным данным JSON. Я создаю ярлыки в своем раскадровке и создаю UIBabel @IBOutlet в своем UITableViewController. В-третьих, я выполнил свой запрос Alamofire, и я могу получить выходные данные всех моих Данных.

Что я не могу сделать: Я не могу получить поля для людей, чтобы заменить мои ярлыки. Я хотел бы получить [имя пользователя] [пол] [местоположение] [день рождения] [мобильный телефон] [подпись] из моего JSON и заменить мои метки этим возвратом. Но когда я хотел бы получить [мобильный телефон], например, я получил нулевой результат.

Я также думаю, что у меня проблема с моей JSON, как это, кажется, не возвращать массив, но только словарь

мой tableviewcontroller

  import UIKit 
import Alamofire 
import SwiftyJson 

class PersonalDetails: UITableViewController { 

    required init(coder aDecoder: NSCoder) { 
     println("init PersonalDetails") 
     super.init(coder: aDecoder) 
    } 

    deinit { 
     println("deinit PersonalDetails") 
    } 

    var usersData = [PersonalDetailsData]() 

    @IBOutlet weak var dataUsername: UILabel! 
    @IBOutlet weak var dataGender: UILabel! 
    @IBOutlet weak var dataArea: UILabel! 
    @IBOutlet weak var dataBirthday: UILabel! 
    @IBOutlet weak var dataMobilePhone: UILabel! 
    @IBOutlet weak var dataSignature: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
     var username = prefs.valueForKey("USERNAME") as NSString 
//load and parse the JSON into an array 
     Alamofire.request(.GET, "http://mywebsite/app/data/jsonpersodata.php", parameters: ["username": username]).responseJSON { (request, response, data, error) in 

      let swiftyJSONObject = JSON(data!) 
      if (error != nil) 
      { 
       // got an error in getting the data, need to handle it 
       println("error calling GET usersdata") 
       println(error) 
      } 
      else if let data: AnyObject = data 
      { 
       // handle the results as JSON, without a bunch of nested if 
       let userdata = JSON(data) 
       if let mobilephone: String = userdata [0]["mobilephone"].stringValue { 
       self.dataMobilePhone.text = mobilephone 
       } 

           } 

     } 

    } 



    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
      } 

    @IBAction func logoutTapped(sender : UIButton) { 

     let appDomain = NSBundle.mainBundle().bundleIdentifier 
     NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!) 

     self.performSegueWithIdentifier("logout", sender: self) 
    } 


    } 

мой класс

import Foundation 

class PersonalDetailsData: NSObject { 

    var dataUsername:String? 
    var dataGender:String? 
    var dataArea:String? 
    var dataBirthday:String? 
    var dataMobilePhone:String? 
    var dataSignature:String? 
} 

мой JSON

[ 
    { 
    "username": "username1", 
    "gender": "?", 
    "location": "??", 
    "birthday": "1983/01\/16", 
    "mobilephone": "136777777", 
    "signature": null 
    } 
] 

моего PHP

<?php 
header('Content-type: application/json'); 
/* include db.config.php */ 
include_once("config.php"); 
// Get user id 
$id = isset($_GET['username']) ? mysql_real_escape_string($_GET['username']) : “”; 

if(empty($id)){ 
    $data = array ("result" => 0, "message" => 'Wrong user id'); 
} else { 
// get user data 
$sql = mysql_query("SELECT username, gender, location, birthday, mobilephone, signature FROM users WHERE username='$id'"); 

$data = array(); 

while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { 
     $row_array['username'] = $row['username']; 
     $row_array['gender'] = $row['gender']; 
     $row_array['location'] = $row['location']; 
     $row_array['birthday'] = $row['birthday']; 
     $row_array['mobilephone'] = $row['mobilephone']; 
     $row_array['signature'] = $row['signature']; 
     //push the values in the array 
     array_push($data,$row_array); 
} 
echo json_encode($data); 

mysql_close($conn); 
/* JSON Response */ 
} 
?> 

ответ

1

вы возвращение JSON на самом деле массив, а не прямое значение объекта вы ожидали (см [ и ] в вашей сырой JSON? Они представляют собой массив).

Вот то, что вы могли бы сделать, чтобы разобрать первый элемент в массиве JSON:

  // handle the results as JSON, without a bunch of nested if 
      let userdata = JSON(data) 
      if let mobilephone: String = userdata[0]["mobilephone"].string { 
       self.dataMobilePhone.text = mobile phone 
      } 
      // etc. 
+0

Romain, спасибо за Ваше сообщение. Я сделал это изменение, как вы упомянули (вы можете видеть, что мой пост редактировался). но я получил ошибку: если разрешить мобильный телефон .... Связанное значение в условной привязке должно быть необязательным типом. – ChinaXiaoHong

+0

Он должен возвращать необязательный, но похоже, что нет. Тогда попробуйте без 'if let'. См. Мой отредактированный ответ. – Romain

+0

Извините, я использовал 'stringValue', но вы должны использовать' string', который действительно возвращает необязательный. С этим обновлением до моего ответа вы должны быть в безопасности: если в вашем коде JSON нет никакого значения «мобильного телефона», ваш код Swift не будет аварийно завершен. – Romain