如何从两个中清除一个pickerView?

Posted

技术标签:

【中文标题】如何从两个中清除一个pickerView?【英文标题】:How can I clear one of pickerView from two? 【发布时间】:2016-12-20 17:40:08 【问题描述】:

我有两个pickerView,当用户在第二个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])

        
     

【问题讨论】:

也许更好的办法是在你的主pickerView中添加第二个组件 【参考方案1】:

reloadAllComponents() 正在调用您的代理进行重新加载。来自documentation:

调用此方法会导致选取器视图向委托查询所有组件的新数据。

但是,您的代码显示您只在其后设置了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()

第二种可能性是您没有清除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

【讨论】:

@EmreErol 再看一遍,好像你没有清除你的数组。您是否在再次添加新项目之前清除了数组?看看我编辑的答案。

以上是关于如何从两个中清除一个pickerView?的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 改变框架的大小和位置

如何在 Swift 的 PickerView 中返回两个单独的数组

pickerview titleForRow 的行总是从 2 开始

当 pickerView 出现时 UITextField 中的文本向左移动

如何创建具有两个表视图的视图,每个表视图在每一行上重用一个pickerview

UIPIckerViews 在一个 UIView 中协同工作