2016-09-07 7 views
0

私はuipickerviewのコンポーネントを更新するためにWebサービスを使用しています。Swift - UIPickerView - "reloadAllComponents"を使用した後でもコンポーネントが非表示になる

すべてのコンポーネントをpickCityOptions配列に追加した後、私はuipickerviewを更新するために "reloadAllComponents"を呼び出します。

私はコンポーネントのアップデートにはうってつけですが、ピッカーのタブまで非表示になっているコンポーネントをすべて更新すると、すべてのコンポーネントが表示されます。

@IBOutlet weak var pickCity: UIPickerView! 

let defaults = NSUserDefaults.standardUserDefaults() 

var pickCityOptions = [String]() 
var items = [[String:String]()] 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.pickCity.dataSource = self; 
    self.pickCity.delegate = self; 

    let urlPath = "http://www.waelmoharram.com/dalel/api/v1/cities" 

    let url = NSURL(string: urlPath) 

    let session = NSURLSession.sharedSession() 

    let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 

     if error != nil { 

      print(error) 

     } else { 


      do { 
       let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSArray 


       var item:AnyObject 

       for i in 0 ... jsonResult.count - 1 { 

        self.items.append([String:String]()) 

        item = jsonResult[i] 



        self.items[i]["id"] = "\(item["id"]!)" as NSString as String 

        self.items[i]["city_name"] = item["city_name"] as! NSString as String 



        self.pickCityOptions.append(self.items[i]["city_name"]!) 

       } 

       self.pickCity.reloadAllComponents() 



      } catch { 

       print(error) 

      } 


     } 

    }) 

    task.resume() 

    if let currentCityRow = self.defaults.stringForKey("city") { 

     self.pickCity.selectRow(Int(currentCityRow)!, inComponent: 0, animated: true) 

    }else{ 

     self.pickCity.selectRow(0, inComponent: 0, animated: true) 

    } 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    defaults.setObject(row, forKey: "city") 

} 


func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return pickCityOptions.count; 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return pickCityOptions[row] 
} 
+0

を使用する代わりにpickCityOptions.appendを使用するようpickCityOptionsを使用する必要があります。 – rmaddy

+0

@rmaddy はい、私はこれを後で考え出しましたが、これは私の問題です。解決方法を教えてください。そして、私はあなたに完璧な回答サインを与えます:D –

+0

多くの例があります。 [これらの検索結果](http://stackoverflow.com/search?q=nsurlsession+dispatch_get_main_queue)から始めてください。 – rmaddy

答えて

0

あなたはNSMutableArray.Don'tは、バックグラウンドスレッドでUIの更新を行うことはありませんpickCityOptions.addObject

var pickCityOptions = NSMutableArray() 
    pickCityOptions.addObject(self.items[i]["city_name"]!) 
関連する問題