2017-08-30 52 views
-1

JSONデータをこのテーブルビューコントローラに渡しました。 JSONデータを取得してテーブルビューのセルに表示する方法JSONデータを取得してテーブルビューセルに表示する方法

私はpassedDataを印刷するとき、私は次のような出力を受け取ります。

["jobs": <__NSArrayM 0x17005d9d0> 
({ 
    jobDate = "2017-08-31"; 
    jobEndTime = 1504144800; 
    jobID = 87; 
    jobTime = 1504137600; 
}, 
{ 
    jobDate = "2017-08-31"; 
    jobEndTime = 1504173600; 
    jobID = 89; 
    jobTime = 1504170000; 
}), 
"result": success, 
"message": Retrieve Sucessfully] 

これは私が使用しているコードです:

var passedData: [String: Any]! 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    guard let jobs = passedData["jobs"] as? [[String:Any]] else {return 0} 
    return jobs.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath) 

    // jobs[indexPath.row] display jobTime 

    return cell  
} 
+0

実際にセルに表示する内容は何ですか?複数の情報を表示したい場合は、おそらく 'UITableViewCell'をサブクラス化し、ジョブデータを格納する独自のクラスを作成する必要があります。 –

答えて

0

を表示する代わりにあなたの件名に回答を与えるように私は、あなたが作業しているドメインを理解する手助けしようとしますと。

取得するJSON応答には、各要素がオブジェクトである配列(jobs)が含まれています。実際には、JSON構文状態すなわち:

  • ストリング
  • オブジェクト(JSONオブジェクト):JSONで

    、値は以下のデータ型のいずれかでなければなりません

  • アレイ
  • ブール
  • ヌル

JSONSerializationクラスを使用している場合、ディクショナリの配列を含む辞書が作成されます。もちろん、コードはここにある

let jsonArrayDict = jsonArray[0] 
print(jsonArrayDict["jobTime"] ?? 0) 

このような単純なスニペットは、次のように行うことができ、配列の要素にアクセスするためには、

if let jsonArray = jsonDict["jobs"] as? [[String: Any]] { 
    print(jsonArray) 
} 

今、あなたにその配列を与えますアプリのクラッシュに注意を払う必要があるため、制作準備はできません。

私が実際に提案するのは、テーブルビューのセルに渡すことができるモデルを使用することです。このアプローチは、これらの利点があります。

  • 回避使用してoptionals
  • 文書にコードを
  • ユニットなど、あなたのコード
ここ

にあなたのJSONオブジェクトを変換する方法についての例をテストします特定のモデル。遊び場で練習し、練習する。

struct Job { 
    let jobDate: String 
    let jobEndTime: Int 
    let jobID: Int 
    let jobTime: Int 
} 

extension Job { 
    init?(dict: [String: Any]) { 
     guard let jobDate = dict["jobDate"] as? String, 
      let jobEndTime = dict["jobEndTime"] as? Int, 
      let jobID = dict["jobID"] as? Int, 
      let jobTime = dict["jobTime"] as? Int else { 
       return nil 
     } 
     self.jobDate = jobDate 
     self.jobEndTime = jobEndTime 
     self.jobID = jobID 
     self.jobTime = jobTime 
    } 
} 

extension Job: CustomStringConvertible { 
    var description: String { 
     return "Job: \(jobDate) \(jobEndTime) \(jobID) \(jobTime)" 
    } 
} 

let jsonString = """ 
    { 
     "jobs": [ 
      { 
       "jobDate": "2017-08-31", 
       "jobEndTime": 1504144800, 
       "jobID": 87, 
       "jobTime": 1504137600 
      }, 
      { 
      "jobDate2": "2017-08-31", 
      "jobEndTime": 1504144800, 
      "jobID": 87, 
      "jobTime": 1504137600 
      } 
     ], 
     "result": "success", 
     "message": "Retrieve Sucessfully" 
    } 
""" 

if let jsonData = jsonString.data(using: .utf8), let jsonObject = try? JSONSerialization.jsonObject(with: jsonData, options: []), 
    let jsonDict = jsonObject as? [String: Any], 
    let jsonArray = jsonDict["jobs"] as? [[String: Any]] { 
    let jobs = jsonArray.flatMap { Job(dict: $0) } 
    print(jobs) 
} else { 
    print("No Results") 
} 
0

これはあなたが解析するのに必要な手順を理解して使用する必要がありますあなたが持っているJSONデータこの答えの範囲を超えているカスタムUITableViewCellを作成する必要があります。プロセスのこの部分について説明するオンラインのリソースがたくさんあります。

また、タイムスタンプを日付に変換する必要があります。これに役立つStackOverflowの回答がたくさんあります。 this one

マッピングJSONデータ

let passedJsonStr = "{\"jobs\":[{\"jobDate\":\"2017-08-31\",\"jobEndTime\":1504144800,\"jobID\":87,\"jobTime\":1504137600},{\"jobDate\":\"2017-08-31\",\"jobEndTime\":1504173600,\"jobID\":89,\"jobTime\":1504170000}],\"result\":\"success\",\"message\":\"Retrieve Sucessfully\"}" 

struct Job { 
    var jobDate: String 
    var jobEndTime: Int 
    var jobID: Int 
    var jobTime: Int 

    init(dict: [String:AnyObject]) { 
     // unwrap these safely, I'm just giving an example 
     self.jobDate = dict["jobDate"] as! String 
     self.jobEndTime = dict["jobEndTime"] as! Int 
     self.jobID = dict["jobID"] as! Int 
     self.jobTime = dict["jobTime"] as! Int 
    } 
} 

var jobs = [Job]() 

if let data = passedJsonStr.data(using: String.Encoding.utf8) { 

    if let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:AnyObject] { 

     if let jsonData = jsonObject["jobs"] as? [[String:AnyObject]] { 
      jobs = jsonData.map { Job(dict: $0) } 
     } 

     print(jobs) 
    } 
} 

のUITableViewに

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath) 

    let job = self.jobs[indexPath.row] 
    cell.titleLabel.text = job.jobDate 

    return cell  
} 
+0

あなたのコードは機能しません。これをチェックしてください。 –

+1

遊び場からの実例で更新しました。以前のコードは電話で行われ、ガイドとして意図されていました。ありがとう – Scriptable

+0

あなたの構造体では 'var'の代わりに' let'を使います。また、正しくないオブジェクトをスキップするために 'init?'イニシャライザを使用します。 –

関連する問題