2016-09-07 3 views
0

Я использую веб-сервис для обновления компонентов uipickerview.Swift - UIPickerView - Компоненты, все еще скрытые после использования «reloadAllComponents»

после добавления всех компонентов в массив pickCityOptions я вызываю «reloadAllComponents» для обновления uipickerview.

i отлично подходит для обновления компонентов, но после обновления всех компонентов, которые все еще скрыты до тех пор, пока я не наберу на сборщике, появятся все компоненты.

@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

Никогда не выполнять обновления пользовательского интерфейса в фоновом потоке. – rmaddy

+0

@rmaddy Да, я понял это позже, и в настоящее время это моя проблема, пожалуйста, скажите мне, как ее решить .. и я дам вам идеальный знак ответа: D –

+0

Существует много примеров. Начните с [этих результатов поиска] (http://stackoverflow.com/search?q=nsurlsession+dispatch_get_main_queue). – rmaddy

ответ

0

Вы должны использовать pickCityOptions в качестве NSMutableArray.Don't использовать pickCityOptions.append вместо этого использовать pickCityOptions.addObject

var pickCityOptions = NSMutableArray() 
    pickCityOptions.addObject(self.items[i]["city_name"]!) 
Смежные вопросы