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 选择的第一个组件决定第二个组件的内容不同步

如何限制 UIPickerView 组件

触摸 UITextField 时设置 UIPickerView 的默认值

如何在 UIPickerView 上添加 UIToolbar? (iPhone/iPad)

根据数据显示数据 UIPickerView

如何在级联中设置 UIPickerView