2016-04-14 26 views
-2

Web servisinden bir JSON nesnesinin alınması Verilerden veri alıyorum ve bunu bir tablo görünümünde göstermek istiyorum.Array kaydedilmiyor

class TableViewController1: UITableViewController { 
    var nomProduit = ["ok"] 
    var prixProduit = [""] 
    var vt1 : String? 
    var vt2 : String? 

    var i : Int! 
    var compteur1:Int! 
    var resultat1:NSArray? 
    var x : AnyObject? 


    override func viewDidLoad() { 


     super.viewDidLoad() 
     // \(detectionString) 
     let str:String = "http://vps43623.ovh.net/yamoinscher/api/products/6194005492077" 
     let url = NSURL(string: str)! 

     let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in 

      if let urlContent = data { 

       do { 

        let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers) 


        self.resultat1 = jsonResult["meme_categorie"] as? NSArray 

        self.compteur1 = self.resultat1!.count 
        print(self.compteur1!) 
        //self.value = (compteur1 as? Int)! 

        for self.i=0 ; self.i < self.compteur1! ; self.i = self.i+1 { 
        if let aStatus = self.resultat1![self.i] as? NSDictionary{ 
         self.vt1 = aStatus["libelle_prod"]! as? String 
         self.nomProduit.append(self.vt1!) 
         self.vt2 = aStatus["prix"]! as? String 
         self.prixProduit.append(self.vt2!) 
         //print(self.nomProduit[self.i]) 


        } 

        } 


       } catch { 

        print("JSON serialization failed") 

       } 


      } 


     } 

     task.resume() 


    } 

Sonra Sorunum bu dizi nil kalır ki:

burada
self.prixProduit.append(self.vt2!) 

tüm

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return 17 
} 


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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! customCell1 

    // cell.PrixSim.text = nomProduit[indexPath.row] 


    print(self.nomProduit[0]) 



    return cell 
} 
+1

'NSURLSession.sharedSession(). DataTaskWithURL()' 'dır. – Larme

+1

Kodunuzu hata ayıklayın, nelerin olup bittiğini görmek için her yere 'print's ekleyin ve yöntemin senkronize olmayan bir şekilde yürütüldüğünü görürsünüz. – luk2302

+0

Uygulama Aktarım Güvenliği Ayarları'na izin verdiniz mi? –

cevap

1

Birinci kategori nesneler için özel bir yapı kullanmak benim kod gerisi, işleri çok daha kolaylaştırıyor. TableViewController1

class TableViewController1: UITableViewController { 

açıklamadan bu yapı

struct Produit { 
    var id : String 
    var prix : String 
    var title : String 
    } 

ve bir veri kaynağı dizisi başında

var produits = [Produit]() 
viewDidLoad yılında

olsun (tüm diğer özellikler/değişkenleri unutmak) veri, veri kaynağı dizisini doldur ve tabloyu yeniden yükle Ana iş parçacığı üzerinde görüntüleyin.
Bu kod numberOfRowsInSection dönüş yerine kodlanmış sayıdan daha öğelerin gerçek sayısı ise Swift yerli toplama tipleri

override func viewDidLoad() { 

    super.viewDidLoad() 
    // \(detectionString) 
    let str = "http://vps43623.ovh.net/yamoinscher/api/products/6194005492077" 
    let url = NSURL(string: str)! 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in 

     if let urlContent = data { 

     do { 
      let jsonObject = try NSJSONSerialization.JSONObjectWithData(urlContent, options: []) 
      if let jsonResult = jsonObject as? [String:AnyObject] { 
      if let memeCategorie = jsonResult["meme_categorie"] as? [[String:String]] { 
       for categorie in memeCategorie { 
       if let prix = categorie["prix"], title = categorie["libelle_prod"], id = categorie["id"] { 
        self.produits.append(Produit(id: id, prix: prix, title: title)) 
       } 
       } 
       dispatch_async(dispatch_get_main_queue()) { 
       self.tableView.reloadData() 
       } 
      } 
      } 
     } catch { 
      print("JSON serialization failed", error) 
     } 
     } else if let connectionError = error { 
      print("connection error", connectionError) 
     } 
    }  
    task.resume() 
    } 

kullanır.
Varsayılan değer 1 olduğundan numberOfSectionsInTableView öğesini çıkartabilirsiniz. cellForRowAtIndexPath yılında

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return produits.count 
    } 

endeksi yoluna göre öğeyi almak ve etiket (ya da her neyse) değer atayabilirsiniz. Şimdilik, değerler sadece çıktı. Eğer `UITableVIew` için için` reloadData` ihtiyaç asynch`

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! customCell1 

    let produit = produits[indexPath.row] 

    print(produit.id, produit.title, produit.prix) 
    return cell 
    } 

}