Каждый раз, когда выполняется функция 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()
}
}
}