Как я могу очистить один из 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