2016-10-12 7 views
0

私はSwiftをかなり新しくしています。私は何をしたいのかを理解することにいくつかの問題があります。Swiftを使用して配列や類似物にjsonデータを追加する方法

私は現在jsonでいくつかのものをテストしています。 私がしようとしているのは、自分のjsonデータから取得したデータを配列に追加することです。私の配列にデータが含まれている場合、UICollectionViewにそれを提示したいと思います。私は配列を使用する必要があると仮定しています。

import UIKit 
import Foundation 

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 

@IBOutlet weak var collectionView: UICollectionView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

func getData() { 
    let path = "http://myurl/test.json" 
    let url = URL(string: path) 
    let session = URLSession.shared 
    let task = session.dataTask(with: url!) { (data: Data?, response: URLResponse?, error: Error?) in 

     let json = JSON(data: data!) 
     for result in json["dokumentstatus"]["dokutskott"]["utskott"].array! { 

      let punkter = result["punkt"].string! 
       print("punkt: \(punkt)") 

      let rubrik = result["rubrik"].string 
       print("rubrik: \(rubrik)") 

      let forslag = result["forslag"].string 
       print("förslag: \(forslag)") 


     } 
    } 
    task.resume() 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return //someArray.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell 

    cell.customLabel.text = //Put the data form rubrik variable 
    cell.customTW.text = //Put the data from foreleg variable 

    return cell 

} 
} 

機能getData()は、私はちょうど配列にこのデータを置く方法を理解する助けが必要な正しいJSONデータを取得します。 (また、私はおそらくのViewControllerにデータを取得するべきではありません知っているが、これは単なるテストです。)

import Foundation 

class Information: NSObject { 

var punkter: String? 
var rubrik: String? 
var forslag: String? 

} 

私は多分、私のようなものに見えるのアレイを使用すべきであると考えていますこれは:var someArray = [Information]() しかし、私はそれを使用する方法がわからないgetData() または私は3つの異なる配列を使用する必要があります、私のjson変数のそれぞれに1つ。

答えて

1

あなたはまだ(よく!は恐ろしいです3異なるアレイを行われる)カスタムクラスを使用しているので、それはあなたが最も可能性の高い構造体が十分にある

var someArray = [Information]() 

を示唆したように、データ・ソースの配列を宣言するために正しいです、私は性質があなたも、プロパティの定数を作るためにletを使用することができます変更しない場合は非オプションの文字列

struct Information { 
    var punkter : String 
    var rubrik : String 
    var forslag : String 
} 

を使用することをお勧めします。

配列を生成するには、nil coalescing演算子を使用してnilを確認し、Informationインスタンスをmemberwise初期化子で作成し、インスタンスをデータソース配列に追加します。その後、メインスレッドのコレクションビューをリロードします。

... 
for result in json["dokumentstatus"]["dokutskott"]["utskott"].array! { 

    let punkter = result["punkt"].string ?? "" 
    let rubrik = result["rubrik"].string ?? "" 
    let forslag = result["forslag"].string ?? "" 
    let information = Information(punkter:punkter, rubrik:rubrik, forslag:forslag) 
    self.someArray.append(information) 

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

編集:

コレクションビューの宣言の後に配列プロパティを追加するには、クラス内cellForItemAtIndexPath使用中

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell 

    let information = someArray[indexPath.row] 
    cell.customLabel.text = information.rubrik 
    cell.customTW.text = information.foreleg 
    return cell 
} 
+0

私の答えに従って、私のビューに私のCollectionViewが正しい量のセルをロードしています。 – idkwat2do

+0

申し訳ありませんが、私は間違いなくすべてを書き終える前にコメントを投稿しました。だから私の質問を続けるために、私は今どのように私のセルのラベルを "rubrik"と "Forslag"の値を取得するTextViewの値を得るために取得するのだろうかと思っています。私は単にこれをやろうとしました: 'cell.customLabel.text = someArray [indexPath.row]'(私はそれが働かないと感じることができました)。どうすれば 'someArray'や' struct'から値を取得できますか?助けてくれてありがとう。 – idkwat2do

+0

私は答えを – vadian

0

データを表示するには:

@IBOutlet weak var collectionView: UICollectionView! 
var informationArray = Array<Information>() 

も、あなたlaで配列を初期化できますあなたに依存する新しいデータを満たす直前に、

ここで、getData()メソッドの内部に入ってみましょう: データがオプションの場合は、まず強制解除しないでください。クラッシュする可能性があります。

  guard let _ = data else { 
       return; 
      } 

      let json = JSON(data: data!) 

      if let resultsArray = json["dokumentstatus"]["dokutskott"]["utskott"] as? Array<Dictionary<String, AnyObject>> { 

       for result in resultsArray { 

        let information = Information() 

        information.punkter = result["punkt"] as? String 
        information.rubrik = result["rubrik"] as? String 
        information.forslag = result["forslag"] as? String 
       } 

      } 

この後、メインビューのスレッドビューでコレクションビューを読み込むことができます。

関連する問題