2017-12-26 27 views
-3

私はこれを理解しようとして約3週間を費やしました。表示するセクションタイトルを取得できますが、JSONデータは表示されません。ファイルに含まれている標準の「配列」を実行すると、その配列が表示されます。TableViewがJSONデータを読み込んでいないSwift 4

私はそこにすべてのヒントとトリックをたどり、私は立ち往生しています。

これはAnyObjectとStringと何か関係があると思いますが、何か不足しています。以下のコードを参照してください:

import UIKit 
import Alamofire 
import SwiftyJSON 

class UserTableViewCell: UITableViewCell { 

    @IBOutlet weak var userFirstname: UILabel! 
    @IBOutlet weak var userLastname: UILabel! 
} 

class Profile2VC: UITableViewController { 

    @IBOutlet var userTable: UITableView! 

var usertitles = ["First Name", "Last Name", "Email", "Mobile Number"] 
var userinfo = [[String:AnyObject]]() //Array of dictionary 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let defaultValues = UserDefaults.standard 
    let URL_USER_LOGIN = "https://www.myapp.com/myphp.php" 
    let userid = "13" 
    let parameters: Parameters=["id":coolid] 

    Alamofire.request(URL_USER_LOGIN, method: .get, parameters: 
parameters).responseJSON { (responseData) -> Void in 
     if((responseData.result.value) != nil) { 
      let swiftyJsonVar = JSON(responseData.result.value!) 
       print(swiftyJsonVar) 

      if let userData = swiftyJsonVar["user"].arrayObject { 
       self.userinfo = userData as! [[String:AnyObject]] 
       //debugPrint(userData) 
      } 

      if self.userinfo.count > 0 { 
       self.userTable.reloadData() 
      } 
     } 
    } 
    self.userTable.reloadData() 

    // Uncomment the following line to preserve selection between 
presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the 
navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem 
} 

// MARK: - Table view data source 


override func numberOfSections(in tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 


override func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return userinfo.count 
} 

override func tableView(_ tableView: UITableView, titleForHeaderInSection 
section: Int) -> String? { 
    return "Section \(section)" 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", 
for: indexPath) as! UserTableViewCell 
    //let userTitles = usertitles[indexPath.row] 
    let userInfo = userinfo[indexPath.row] 
    cell.userFirstname?.text = userInfo["first_name"] as? String 
    cell.userLastname?.text = userInfo["last_name"] as? String 
    //cell.imageView?.image = UIImage(named: fruitName) 
    //cell.textLabel?.text = usertitles[indexPath.row] 

    return cell 
} 
} 
+0

あなたが外で、要求クロージャ内のデータをリロードする必要はありません。また、メインキューにリロードをディスパッチする必要があるかもしれません。 – Paulw11

+0

レポオーバーgithubを共有します。これを見てください。 –

+0

@MauricioChirino NDAの守秘義務のためにできません。私はちょうどここにこのコードを投稿することができます。 – Greg

答えて

0

まず、メインビューのテーブルビューを再読み込みする必要があります。コードの下にチェック:

DispatchQueue.main.async { 
    self.userTable.reloadData() 
} 

そして、あなたはそれを良くない複数回リロードされているので、不要なリロードコードを削除し、最終的なコードは次のようになります。

Alamofire.request(URL_USER_LOGIN, method: .get, parameters: parameters).responseJSON { (responseData) -> Void in 
     if((responseData.result.value) != nil) { 
      let swiftyJsonVar = JSON(responseData.result.value!) 
       print(swiftyJsonVar) 

      if let userData = swiftyJsonVar["user"].arrayObject { 
       self.userinfo = userData as! [[String:AnyObject]] 
       //debugPrint(userData) 
      } 

      if self.userinfo.count > 0 { 
       DispatchQueue.main.async { 
        self.userTable.reloadData() 
       } 
      } 
     } 
    } 
    //self.userTable.reloadData() //Remove this code 

そして、あなたのAPIコールが行われ、一度、確認してくださいdebugPrint(userData)がいくつかのデータを印刷していて、userTableをリロードするときには、cellForRowAtにブレークポイントを設定して呼び出していることを確認してください。

次に、その呼び出しとデータがサーバーからある場合、あなたは良いです。

cellForRowAtメソッドが呼び出されなかった場合、正しく接続されているかどうかを確認する必要があります。userTable DataSourceとDelegate。

+0

cellForRowAtにブレークポイントを追加しましたが、何もしませんでした。 debugPrintをオンにすると正常に動作し、印刷されました。 jsonを取得しているようです。しかし、テーブルにはまだデータが表示されていません。 Xcodeで選択したすべてのデバッグオプションは、正しく動作することを示しています.JSONは配列に入っていますが、テーブルには表示されません。私は、VCを拭き取り、静的なセルでやり直すことを検討しています。 – Greg

+0

あなたはそれのデモプロジェクトを共有できませんか? –

0

は、このコードを試してみてください。

let API = URL(string:"http://www.myapp.com/myphp.php") 
    let request = URLRequest(url:API!) 
    let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in 
     if let data = data { 
      if String(data: data, encoding: String.Encoding.utf8) != nil { 
       let data = data 
       let json = try? JSONSerialization.jsonObject(with: data, options: []) 
       let jsonData = json as! [[String:Any]] 

      DispatchQueue.main.sync { 

       let user = jsonData.flatMap { $0["user"] as? String } 
       print(user) 

       self.annocumentTableView.reloadData() 
      } 
     } 
    } 
}) 
task.resume() 
+0

この情報をありがとうございますが、Alamofireコードはどこに置いてくださいか?私は特定の基準に基づいて要求を得る必要があります。 – Greg

関連する問題