2016-04-21 2 views
0

Я пытаюсь реализовать CoreData с моим существующим быстрым проектом. Я следовал this tutorial и реализовал его с помощью UITableView.Swift: Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «Имя сущности не должно быть nil».

Данные становятся доступными для модели данных (с другого контроллера представления), когда я извлекаю данные модели данных (в другом контроллере представления).

Проблема

Переход к View Controller с UITableView, показывает данные из модели данных один раз. Нажатие на Tableview или сдвинув ее вверх или вниз, в результате чего приложения к сбою с ошибкой

Нагрузочного приложением из-за неперехваченное исключение «NSInvalidArgumentException», причина: "Название объекта не должно быть нулевым.

Функция для экономии записи:

func saveData(date: String, usr : String, piid: String, healthD:String, temp:String, humd:String) { 
     //1 
     let managedContext = DataController().managedObjectContext 

     //2 
     let entity = NSEntityDescription.entityForName("Hygeine", 
      inManagedObjectContext:managedContext) 

     let health = NSManagedObject(entity: entity!, 
      insertIntoManagedObjectContext: managedContext) 

     //3 
     health.setValue(date, forKey: "date") 
     health.setValue(healthD, forKey: "health") 
     health.setValue(temp, forKey: "temp") 
     health.setValue(humd, forKey: "humd") 
     health.setValue(piid, forKey: "pi_id") 
     health.setValue(usr, forKey: "usr") 
     //4 
     do { 
      try managedContext.save() 
      //5 
      healthData.append(health) 
     } catch let error as NSError { 
      print("Could not save \(error), \(error.userInfo)") 
     } 
    } 

ViewWillAppear для ViewController с UITableView:

override func viewWillAppear(animated: Bool) { 

     let managedContext = DataController().managedObjectContext 

     //2 
     let fetchRequest = NSFetchRequest(entityName: "Hygeine") 

     //3 
     do { 
      let results = 
      try managedContext.executeFetchRequest(fetchRequest) 
      healthData = results as! [NSManagedObject] 
     } catch let error as NSError { 
      print("Could not fetch \(error), \(error.userInfo)") 
     } 
    } 

Есть много решения Objective-C к этой проблеме, но как решить его в Swift 2. Что я здесь делаю неправильно?

+1

Вы когда-нибудь рассматривали использование контроллера NSFetchedResults и его делегатов вместо массива ??? Это решит вашу проблему, я верю :) –

+0

Можете ли вы предложить мне учебник, поскольку я новичок в разработке iOS? @SandeepBhandari –

+0

Я прошел этот учебник четыре года назад :) так было в объективе c :) https://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use- nsfetchedresultscontroller Взгляните на это очень красиво объяснили :) большинство методов в swift одинаковы :) так что не должно быть никаких проблем, чтобы справиться :) –

ответ

1

entityForName возвращает необязательный факт, что вы являетесь силой разворачивания. Скорее всего, ваша ошибка и легко попасть в отладчик.

Неправильно ли введено имя вашего лица? Проверьте его против вашей модели.

И, как говорили другие, узнайте NSFetchedResultsController, но он не решит эту ошибку, с ней работать с UITableViewController проще.

+0

Название объекта было правильным. NSFetchedResultsController помог обновить UITableView по мере добавления нового объекта данных. Спасибо! –

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

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