下面,我有一些要使用CoreData
保存的分段控件。看起来很简单,但是仅保存了最新的控制索引。其余的由于某种原因被重置为0。我没有选中每个属性的默认设置。
Quote
是我的主要实体,并且与Worksheet
具有一对一的关系,称为worksheet
。
@IBAction func segmentPressed(_ sender: UISegmentedControl) {
let worksheet = Worksheet(context: context)
switch sender.tag {
case 0:
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
case 1:
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
case 2:
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
default:
break
}
if let quote = currentQuote as? Quote {
quote.worksheet = worksheet
appD.saveContext()
}
}
更新:我完全摆脱了switch语句...现在可以正确保存了。但是我仍然想知道为什么要重置这些值。也许保存上下文时Int属性会自动设置为零,但是它没有任何值?看起来这就是默认值设置所要执行的操作。除了我的人都未被检查。
答案 0 :(得分:1)
每次执行segmentPressed
函数时,都会创建一个新的Worksheet
对象(其所有属性均具有默认值)。您编写的代码(使用switch
语句)仅设置了一个属性的值,具体取决于已敲击哪个分段控件。正如您在更新中注意到的那样,在删除switch语句之后,您的代码将更新所有属性的值,并且所有属性看起来都很好。
但是,由于每次都创建一个新的Worksheet
对象,因此您需要考虑旧对象的情况。由于关系是一对一的,因此当您将新的Worksheet
分配给currentQuote
时,指向旧Worksheet
对象的链接将被删除-但旧的Worksheet
对象仍然保留。因此,您将建立一组没有任何Worksheet
链接的“孤立” Quotes
对象。
为避免这种情况,应检查currentQuote
是否具有现有的Worksheet
对象。如果是这样,请更新该对象的适当属性;如果不是,则创建一个新的Worksheet
,设置其属性值(您可能希望设置所有属性值)并将关系设置为currentQuote
。像这样:
@IBAction func segmentPressed(_ sender: UISegmentedControl) {
if let worksheet = currentQuote?.worksheet {
switch sender.tag {
case 0:
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
case 1:
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
case 2:
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
default:
break
}
appD.saveContext()
} else {
if let quote = currentQuote as? Quote {
let worksheet = Worksheet(context: context)
worksheet.irrigation = Int32(irrigationSegment.selectedSegmentIndex)
worksheet.waste = Int32(wasteSegment.selectedSegmentIndex)
worksheet.water = Int32(waterSegment.selectedSegmentIndex)
quote.worksheet = worksheet
appD.saveContext()
}
}
}