>我首先用这段代码声明一个变量 methodType
var methodType: Bool? = nil
然后,我继续使用像这样的分段控件(也称为methodType(设置此变量。
else if indexPath.row == 1 {
cell.methodType.isHidden = false
cell.methodType.selectedSegmentIndex = UISegmentedControlNoSegment
switch cell.methodType.selectedSegmentIndex{
case 0: methodType = true
case 1: methodType = false
default:
break
}
然后我去设置一个布尔的 CoreData 属性 = 到 methodType 变量,就像这样。
expense.cash = methodType!
expense.credit = !methodType!
但是,当我运行该应用程序时,由于某种原因,我收到线程 1 EXC 错误?做错了什么?
我将首先解释为什么会发生错误,然后解释您的误解是什么。
在这些行中:
cell.methodType.selectedSegmentIndex = UISegmentedControlNoSegment
switch cell.methodType.selectedSegmentIndex{
case 0: methodType = true
case 1: methodType = false
default:
break
}
您将cell.methodType.selectedSegmentIndex
设置为UISegmentedControlNoSegment
。我认为UISegmentedControlNoSegment
是 -1 的常量值。 因此,当您打开它时,它会转到default
分支,因为所选索引既不是 0 也不是 1。
因此,运行上述行后methodType
未设置,仍然nil
。
然后你尝试使用!
强制解开它,这当然会导致崩溃。
您误解了如何将selectedSegmentedIndex
"绑定"到变量methodType
。一种方法如下:
将当前 switch 语句替换为对addTarget
的调用:
cell.methodType.addTarget(self, action: #selector(methodTypeChanged), for: .valueChanged)
然后将一个名为methodTypeChanged
的方法添加到您的类中:
func methodTypeChanged(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex{
case 0: methodType = true
case 1: methodType = false
default:
break
}
}
您还应该考虑用户未选择任何内容的情况。因此,在设置核心数据属性时,应检查methodType
是否为nil:
if let methodType = self.methodType {
expense.cash = methodType
} else {
// user hasn't selected anything. show an error message or use a default value.
}
另外,我认为您应该删除credit
属性。它似乎总是具有与cash
相反的值,因此不需要它。您只需访问credit
即可知道cash
的价值。