Sane
Sane

Reputation: 61

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

Upvotes: 0

Views: 253

Answers (1)

Francesco Deliro
Francesco Deliro

Reputation: 3939

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

Upvotes: 1

Related Questions