How can I clear one of pickerView from two?

284 views Asked by At

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

        }
    } 
1

There are 1 answers

1
Zac Kwan On BEST ANSWER

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