【问题标题】:UIPickerView depending on first componentUIPickerView 取决于第一个组件
【发布时间】:2023-08-16 07:53:01
【问题描述】:

所以我有一个包含两个组件的 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)
        }
    }
}

【问题讨论】:

    标签: ios swift core-data uipickerview


    【解决方案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 的更新还是别的什么?