Как я могу очистить один из pickerView от двух?

У меня есть два pickerViews, и когда пользователь выбирает первый после загрузки второго pickerView. Но если пользователь снова выполнит это действие, все данные добавляются ко второму pickerView. Я должен очистить второй контент pickerView, когда пользователь выбирает первый. Я использую метод reloadAllComponents(), но он не работает.

Мой код;

    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 ответ

Решение

reloadAllComponents() вызывает вашего делегата для перезагрузки. Из документации:

Вызов этого метода приводит к тому, что представление средства выбора запрашивает у делегата новые данные для всех компонентов.

Однако ваш код показывает, что вы устанавливаете только pckerview2.delegate после этого.

self.pckerview2.reloadAllComponents()
self.pckerview2.delegate = self
self.pckerview2.dataSource = self

Так что я думаю, что reloadAllCompontents() не удалось запросить делегата как есть nil(Если вы не установили его в другом месте) Попробуйте переместить его ниже так:

self.pckerview2.delegate = self
self.pckerview2.dataSource = self 
self.pckerview2.reloadAllComponents()

2-я возможность заключается в том, что вы не очистили city_array поэтому вы всегда добавляете к нему город. Если это так, до for петли просто добавить removeAll(), Что-то вроде этого:

print("Looping------------------>")
    if let objects = objects {
        self.city_array.removeAll()
        self.cityIds_array.removeAll()

        for object in objects {
        // rest of the codes
Другие вопросы по тегам