UIPickerView 取决于第一个组件
Posted
技术标签:
【中文标题】UIPickerView 取决于第一个组件【英文标题】:UIPickerView depending on first component 【发布时间】:2017-12-03 19:20:06 【问题描述】:所以我有一个包含两个组件的 UIPickerView。第一个称为“橱柜”,第二个称为“抽屉”。它们在 CoreData Cupboards > Drawer 中有一对多的关系。如果我选择橱柜,我希望只显示匹配的抽屉。我不确定如何处理这种关系。
这就是我展示橱柜的原因:
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 2
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if(component==0)
return cupboards.count
xxxx
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if(component==0)
return cupboards[row].name
xxxx
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if(component==0)
提前谢谢你
更新:
现在知道了,但我没有得到任何结果。
var cupboardDrawers = [Drawer]()
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if(component==0)
let request: NSFetchRequest<Drawer> = Drawer.fetchRequest()
request.predicate = NSPredicate(format: "cupboard == %@", cupboards[row].name!)
do
let result = try mgdContext.fetch(request)
cupboardDrawers = result
addEatDataPicker.reloadAllComponents()
catch
print(error.localizedDescription)
【问题讨论】:
【参考方案1】:您需要使用获取结果创建和更新一个 cupboardDrawers 数组:
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 2
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
if(component==0)
return cupboards.count
else
return cupboardDrawers.count
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
if(component==0)
return cupboards[row].name
else
return cupboardDrawers[row].yourProperty
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
if(component==0)
// you can add this part to a separate function and call it here
cupboardDrawers = []
let request = NSFetchRequest<Drawer>(entityName:”Drawer”)
request.predicate = YourPredicate with cupboards[row].name
do
let items = context.fetch(request)
guard items.count > 0 else
print(“no items found”)
return
cupboardDrawers = items
//reload your picker
catch
print(error)
【讨论】:
嘿,谢谢,我是 swift 新手,不确定我用什么代替 YourPredicate。而cupboardDrawers 应该是var cupboardDrawers = [Drawer]()
对吧?
不客气 ;) 是的,它是正确的,谓词取决于您如何设置实体,例如它可以是 NSPredicate(format: “cupboard == %@”, cupboards[row] .name)
嗯,我接到了no items found
电话
在你的谓词中尝试cupboard.name,这取决于你如何建立你的关系。
非常感谢,一切正常 :) 但我还有一个问题。我创建了一个函数来从抽屉中创建一个新的子对象,为了获得正确的抽屉,我在 do 选择中创建了一个新的 var selectedDrawer = cupboardDrawers[row]
。问题是我收到Index out of range
错误 - 当我创建带有 1 个抽屉的橱柜 1、带有 2 个抽屉的橱柜 2 等等时,它可以工作。这是 selectedDrawer 的更新还是别的什么?以上是关于UIPickerView 取决于第一个组件的主要内容,如果未能解决你的问题,请参考以下文章
UIPickerView 选择的第一个组件决定第二个组件的内容不同步
触摸 UITextField 时设置 UIPickerView 的默认值