2016-11-02 3 views
2

Я пытаюсь отладить приведенный ниже код.CoreData, похоже, сохраняет неправильную переменную

1) CellClass имеет IBAction изменить булево значение, значение заявленного в качестве значения: Bool

@IBAction func dashBrnPressed(_ sender: AnyObject) { 
    value == true ? (value = false) : (value = true) 
    NotificationCenter.default.post(name: .reload, object: nil) 
             // reloads the TableView 
} 

2) Я использую контроллер UITableView с dequeueReusableCell и загрузкой CoreData. Эти строки отвечают только за ячейку. «SwitchAction» является значением из CoreData

if cell.value == true{ 
    switchAction.isOn = true 

    }else{ 
    switchAction.isOn = false 

    } 

    DataBaseController.saveContext() 
    cell.value = switchAction.isOn 

    return cell 

3), кажется, работает, если я не перезапустить приложение. Никаких сбоев, но он возвращает значение FALSE по умолчанию. Мне нужно сохранить значение назад в CoreData в зависимости от того, какой оператор является кнопкой.

Код, конечно, упрощен.

+2

Попробуйте переименовать свой атрибут. Я видел предыдущие вопросы/ответы, которые указывают на то, что CoreData борется с именами логических атрибутов, начинающимися с «is ....». – pbasdf

+0

он по-прежнему возвращает FALSE после перезагрузки ... –

ответ

0

Причина еще unknowm, но этот код работает

1) cell.value теперь необязательны и равна nil при перезапуске приложения

2) Этот код в cellForRow Теперь во-первых, присваивает необязательное значение и только тогда, когда значение есть сохраняет новое значение функции 3) willDisplay оленьей кожи вернется UITableViewCell и не требуется

switch cell.value { 
    case nil: 

     if switchAction.dashboard == true{ 
      cell.dashBtn.tintColor = .white 
      cell.value = true 

     } else { 

      cell.dashBtn.tintColor = myColors.opaceGrayColor 
      cell.value = false 
     } 

    case true?: 

    switchAction.dashboard = true 
    cell.dashBtn.tintColor = .white 
    DataBaseController.saveContext() 


    case false?: 

    switchAction.dashboard = false 
    cell.dashBtn.tintColor = myColors.opaceGrayColor 
    DataBaseController.saveContext() 
} 

Я счастлив и благодарю вас за помощь! :)

1

Я думаю, что вижу проблему. В блоке кода под ч.2, вот что вы делаете:

  1. Набор switchAction.isOn к значению cell.value
  2. Сохранить switchAction.isOn в CoreData
  3. Установите cell.value к значению switchAction.isOn

При перезапуске приложения cell.value по умолчанию имеет значение false, а затем вы перезаписываете это значение на switchAction.isOn и сохраняете его обратно в CoreData. Поэтому, хотя switchAction.isOn может быть загружен с правильным значением, вы перезаписываете его, прежде чем вы его увидите.

Что вам нужно, это задание, которое идет по другому пути:

cell.value = switchAction.isOn 

С cell является многоразовым вид ячейки таблицы, вы можете поместить эту строку в функции tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath) делегата, который называется прямо перед ячейкой отображается.

+0

Да, это был бы самый простой способ. Проблема в том, что ячейка является dequeueReusableCell, и она недоступна нигде рядом с функцией cellForRow :( –

+0

И вы правы, значение, хранящееся в ядровые данные даже после перезапуска правильны. Это переопределяет где-то, и это ужасно –

+1

@DanilMihnevich Извините, я пропустил часть о dequeueReusableCell.Вы можете поместить эту строку в функцию делегата 'tableView (UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath). Обновленный ответ, чтобы добавить это. – Robert

Смежные вопросы