基于返回的CoreData实体属性在UIPickerView Row上聚焦问题

时间:2018-06-01 16:29:01

标签: ios arrays swift core-data uipickerview

我有三个名为“CircuitSub”,“Item”和“ItemSubCircuit”的核心数据实体。在“Item”和“ItemSubCircuit”之间存在名为“toCircuitSub”的一对一反向关系。我成功地将条目添加到所有三个核心数据实体中,并将​​它们显示在特定的VC中,在桌面视图单元格中滑动到“编辑”& “删除”功能。

在CreateItem VC中(参见下面的代码)我有一个UIPickerView,它通过“CircuitSub”实体填充并显示所有子电路的名称。我还在行“0”处添加了“未分配”选项。保存新项目时,它按预期成功将“未分配”或选定的子电路名称写入“Item.toCircuitSub”名称属性。

问题是当我选择可滑动的单元格编辑操作时,我无法让UIPickerview显示保存到“Item.toCircuitSub”名称属性的“选定”子电路。我100%肯定该属性有一个值,因为我有一个文本字段正在成功填充以验证该属性。如果我注释掉“if let loadedSubCircuit”代码,则所选单元格信息中的信息在表单中加载正常,UIPickerView按预期显示所有子电路名称,但重点是第0行“未分配”标题。如果我取消注释“if let loadedSubCircuit”代码,它会在“let s = circuitsSub [index]”行中以“致命错误:索引超出范围”崩溃。我已经在这个问题上工作了好几天了,我不能指责它。除了这个问题,我还想在UIPickerView中对子电路进行排序(A> Z),同时在第0行保留“未分配”。你有任何指针吗?

    //======================================================================
    //MARK: VARIABLES
    //======================================================================
    var delegateItems: CreateItemControllerDelegate?
    var itemSubCircuit: ItemSubCircuit?
    var itemElecSpecs: ItemElecSpecs?
    var circuitsSub = [CircuitSub]() //Empty Array

    var item: Item? {
        didSet {
            nameTextField.text = item?.name

            if let imageData = item?.image {
                itemImageView.image = UIImage(data: imageData)
                setupCircularImageSytle()
            }

            circuitSubNameTextField.text = item?.toItemSubCircuit?.name
// START PROBLEM AREA
            if let loadedSubCircuit = item?.toItemSubCircuit?.name {

                var index = 0
                repeat {

                    let s = circuitsSub[index] //GIVES ERROR: Thread 1: Fatal error: Index out of range
                    if s.name == loadedSubCircuit {

                        circuitSubPicker.selectRow(index, inComponent: 0, animated: false)
                        break
                    }
                    index += 1

                } while (index < circuitsSub.count)
            }
// END PROBLEM AREA
        }
    }
    //======================================================================


//======================================================================
//MARK: VIEW CONTROLLER LIFECYCLES
//======================================================================
override func viewDidLoad() {
    super.viewDidLoad()

    setupUI()
    setupCancelButton()

    self.circuitsSub = CoreDataManager.shared.fetchCircuitsSub()
    self.circuitSubPicker.dataSource = self;
    self.circuitSubPicker.delegate = self;

    //circuitSubNameTextField.text = unassignedSubCircuitValue
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(handleSave))

    view.backgroundColor = UIColor.colorThemeDkBlue
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    navigationItem.title = item == nil ? "Create Item" : "Edit Item"
}
//======================================================================



//======================================================================
//MARK: UIPICKERVIEW
//======================================================================
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView == circuitSubPicker {
        return circuitsSub.count + 1
    }
    return 0
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == circuitSubPicker {
        return row == 0 ? "Unassigned" : circuitsSub[row - 1].name
    }
    return ""
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == circuitSubPicker {

        if row == 0{
            print("Unassigned")
            circuitSubNameTextField.text = "Unassigned"
        } else {
            print(circuitsSub[row - 1].name ?? "")
            circuitSubNameTextField.text = circuitsSub[row - 1].name
        }
    }
}

//======================================================================

0 个答案:

没有答案