简体   繁体   English

UIPickerView取决于第一个组件

[英]UIPickerView depending on first component

So I have a UIPickerView with two components. 因此,我有一个包含两个组件的UIPickerView。 The first one called "Cupboards", the second "Drawer". 第一个称为“橱柜”,第二个称为“抽屉”。 They have a one to many relationships in CoreData Cupboards <-->> Drawer. 它们在CoreData橱柜<->>抽屉中具有一对多关系。 I would like that if I select a Cupboard, only the matching Drawers get displayed. 我希望如果选择一个橱柜,则仅显示匹配的抽屉。 I'm not sure how to get that working with the relationship. 我不确定如何处理这种关系。

That's what I have for showing the Cupboard: 那就是我展示橱柜的方式:

    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){

    }
}

Thank you in advance 先感谢您

Update: 更新:

Got it like that now, but I get no results. 现在就这样了,但是我没有结果。

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)
        }
    }
}

You need to create and update a cupboardDrawers array with the fetching results: 您需要使用获取结果创建和更新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) 
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM