I'v got two pickerViews and when user select first after the second pickerView is loading. But if user does it again this action, all datas appending to second pickerView. I have to clear second pickerView content when user select first one. I am using reloadAllComponents() method but it is not worked.
My Code;
var country_array = [String]()
var countryIds_array = [String]()
var city_array = [String]()
var cityIds_array = [String]()
override func viewDidLoad() {
super.viewDidLoad()
getCountry()
}
func getCountry(){
//var hata = false
print("Getting Country List")
let query = PFQuery(className: "cls_ulke")
query.limit = 300
query.order(byDescending: "oncelik")
query.findObjectsInBackground { (objects: [PFObject]?, error) -> Void in
if error == nil {
print("Getted!")
print("Looping------------------>")
if let objects = objects {
for object in objects{
print(object.objectId ?? "BOŞ")
print(object["ulke_adi"])
self.country_array.append(object["ulke_adi"] as! String)
self.countryIds_array.append(object.objectId!)
}
self.pckerview.delegate = self
self.pckerview.dataSource = self
}
print("<-------------------Looped")
}else{
print("HATA")
}
}
}
func getCities(objectID:String){
print("Getting City List")
let query = PFQuery(className: "cls_il")
query.limit = 1000
query.order(byDescending: "oncelik")
query.whereKey("ulke_ID", equalTo: PFObject(withoutDataWithClassName: "cls_ulke", objectId: objectID))
query.findObjectsInBackground { (objects:[PFObject]?, error) in
if error == nil {
print("Getted!")
print("Looping------------------>")
if let objects = objects {
for object in objects {
print(object["il_adi"])
self.city_array.append(object["il_adi"] as! String)
self.cityIds_array.append(object.objectId!)
}
self.pckerview2.reloadAllComponents()
self.pckerview2.delegate = self
self.pckerview2.dataSource = self
}
print("<-------------------Looped")
}else{
print("HATA")
}
}
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
var donecek = 0
if pickerView == pckerview {
donecek = country_array.count
}else if pickerView == pckerview2{
donecek = city_array.count
}
return donecek
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
var donecek = ""
if pickerView == pckerview {
donecek = country_array[row]
}else if pickerView == pckerview2{
donecek = city_array[row]
}
return donecek
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView == pckerview {
tfield.text = countryIds_array[row]
getCities(objectID:countryIds_array[row])
}
}
The reloadAllComponents()
is calling your delegate for a reload. From the documentation:
Calling this method causes the picker view to query the delegate for new data for all components.
However, your code show that you are only setting the pckerview2.delegate
after it.
self.pckerview2.reloadAllComponents()
self.pckerview2.delegate = self
self.pckerview2.dataSource = self
So my guess is that the reloadAllCompontents()
did not manage to query the delegate as it is nil
.(Unless you have set it in other place) Try moving it below like this:
self.pckerview2.delegate = self
self.pckerview2.dataSource = self
self.pckerview2.reloadAllComponents()
The 2nd possibilities is that you did not clear the city_array
therefore you are always appending city to it. If that is the case, before the for
loops just add a removeAll()
. Something like this:
print("Looping------------------>")
if let objects = objects {
self.city_array.removeAll()
self.cityIds_array.removeAll()
for object in objects {
// rest of the codes