我有三个名为“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
}
}
}
//======================================================================