如何从两个中清除一个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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 的 PickerView 中返回两个单独的数组
pickerview titleForRow 的行总是从 2 开始
当 pickerView 出现时 UITextField 中的文本向左移动