Search code examples
iosswiftcore-datauipickerview

UIPickerView depending on first component


So I have a UIPickerView with two components. The first one called "Cupboards", the second "Drawer". They have a one to many relationships in CoreData Cupboards <-->> Drawer. 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)
        }
    }
}

Solution

  • You need to create and update a cupboardDrawers array with the fetching results:

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