2016-12-09 8 views
0

私はロバだと答えることはありません...しかし、Swift 1.2からSwift 3へのプロジェクトの移行には夢中になります私は自分で勉強しようとしている)。 問題は私が理解できない問題に遭遇していることです。json pickerViewにエラーが発生しました予期しないエラーが発生しました。オプションの値をアンラップしています

WebからJSONを読み込んでピッカービューに読み込むカテゴリを取得していますが、試してみるとアプリがクラッシュします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

'Data(contentsOf:urlCat!);'が失敗し投げられたため 'dataCat'は' nil'です。 – shallowThought

+1

Swift 3では、JSON辞書の表現は '[String:Any]'であり、同期 'Data(contentsOf')を使用してリモートURLからデータをロードすることを強くお勧めします。 – vadian

+0

彼らはまた、死ぬ! – Ast

答えて

0

OK、あなたの助けのおかげで、私はそれを動作させることができた、と今の機能は、このなる:

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() 

    } 

が、私は別の奇妙な行動を経験しています:ピッカービューの項目はvisibileのみになります私はそれに触れた後...しかし、なぜですか? viewdidとviewdidloadにロードしようとしましたが、何も変更されません。

関連する問題