0

두 번째 pickerView가 있고 사용자가 두 번째 pickerView가로드 된 후 처음으로 선택하면. 그러나 사용자가이 작업을 다시 수행하면 두 번째 pickerView에 추가되는 모든 데이터. 사용자가 첫 번째 항목을 선택하면 두 번째 pickerView 내용을 지워야합니다. reloadAllComponents() 메서드를 사용하고 있지만 작동하지 않습니다.2에서 pickerView 중 하나를 지울 수 있습니까?

내 코드;

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

     } 
    } 
+0

두 번째 구성 요소를 주 피커에 추가하는 것이 더 나을 수도 있습니다. –

답변

2

reloadAllComponents()은 재부팅을 위해 대리인을 호출합니다. documentation에서 :

이 메서드를 호출하면 피커 뷰가 모든 구성 요소의 새 데이터를 위임자에게 쿼리합니다.

그러나 코드는 그 후에 만 ​​pckerview2.delegate으로 설정한다는 것을 보여줍니다.

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

그래서 내 생각은 nil 그대로 reloadAllCompontents()가 대리자를 조회 할 관리하지 않은 것입니다 (다른 장소에 설정하지 않는 한)과 같이 아래에 이동보십시오.

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

두 번째 가능성은 city_array을 지우지 않았으므로 항상 도시를 추가하는 것입니다. 이 경우 for 루프 전에 removeAll()을 추가하기 만하면됩니다. 다음과 같이하십시오 :

+0

변경하지 않으셔도됩니다. 하지만 고마워. –

+0

@EmreErol 다시보고, 당신의 배열을 지우지 않은 것처럼 보입니다. 새 항목을 다시 추가하기 전에 배열을 지우셨습니까? 내 편집 된 대답을보세요. –

+0

감사합니다. 배열을 삭제하면 효과가 있습니다! –