2016-12-09 40 views
0

請不要回答我,我是一頭驢子......但是我瘋狂地將一個項目從Swift 1.2移植到Swift 3我試圖自己學習)。 問題是,我遇到了一個我無法理解的問題:填充json pickerView錯誤意外發現零,同時展開一個可選值

我正在閱讀Web上的JSON以檢索某些類別以加載到Picker視圖,但是當我嘗試時該應用崩潰序列化JSON

/////////////// PICKER VIEW 

    func populatePicker(){ 

    let urlCat = URL(string: "http://www.direttaweb.it/geoApp/html5/JSON_cat.php)"); 

    let dataCat = try? Data(contentsOf: urlCat!); 

    var errorCat: NSError? 



    do { 
     /* HERE CRASH -> */ if let jsonObjectCat = try JSONSerialization.jsonObject(with: dataCat!, options: []) as? [String: AnyObject] { 
    // parse JSON 

    if let jsonObjectCat = jsonObjectCat as? [String: AnyObject] , errorCat == nil, 

    let jsonDataCat = JSONValue.fromObject(jsonObjectCat as AnyObject)?["data"]?.array { 
     for categoriaJSON in jsonDataCat { 

      if let categoriaJSON = categoriaJSON.array, 
       // 5 
       let categoria = Categoria.fromJSONCAT(categoriaJSON) { 

       categorie.append(categoria) 


        } 
       } 
      } 
     self.pickerCategorie.delegate = self 
     self.pickerCategorie.dataSource = self 


     } 
    }catch{ 
    print(errorCat!) 
    } 

    } 

奇怪的是,幾行以上,我做同樣的事情與一個函數,它幾乎是相同的(除了我填充所述陣列)另一個目的和我沒有問題... 請讓我知道我犯了什麼錯誤!

+1

'dataCat'是'nil',因爲'Data(contentsOf:urlCat!);'失敗並拋出。 – shallowThought

+1

在Swift 3中,JSON字典的表示是'[String:Any]',並且強烈建議您不要使用同步的'Data(contentsOf'從遠程URL加載數據。 – vadian

+0

他們也刪除了我想要的循環的C風格去死! – Ast

回答

0

好的,感謝你的幫助,我能使其工作,現在的功能變成這樣:

func populatePicker(){ 

     let urlCat = "http://www.direttaweb.it/geoApp/html5/JSON_cat.php"; 



     let url = URL(string: urlCat) 
     URLSession.shared.dataTask(with:url!) { (dataCat, response, error) in 
      if error != nil { 
       print(error ?? "errore nel json delle categorie") 
      } else { 
       do { 


        if let jsonObjectCat = try JSONSerialization.jsonObject(with: dataCat!, options: []) as? [String: AnyObject] { 
         // parse JSON 


         // 3 
         if let jsonObjectCat = jsonObjectCat as? [String: AnyObject] , 
          // 4 
          let jsonDataCat = JSONValue.fromObject(jsonObjectCat as AnyObject)?["data"]?.array { 
          for categoriaJSON in jsonDataCat { 

           if let categoriaJSON = categoriaJSON.array, 
            // 5 
            let categoria = Categoria.fromJSONCAT(categoriaJSON) { 

            print(categoria.categoria) 
            self.categorie.append(categoria) 

           } 

          } 
         } 
         self.pickerCategorie.delegate = self 
         self.pickerCategorie.dataSource = self 


        } 



       } catch let error as NSError { 
        print(error) 
       } 
      } 

      }.resume() 

    } 

,但我遇到了另一個奇怪的現象:在選擇器視圖中的項目都看得到不僅成爲我摸了它之後......但是爲什麼? 我嘗試在viewdidappear和viewdidload中加載,但沒有任何更改...

相關問題