2015-07-28 7 views
0

Совершенно новый для разработки iOS и Swift, поэтому я надеюсь, что вы несете со мной. Я создаю приложение простой заметки, основанное на приложении Apple Notes.Сохранение текста из UITextView с использованием основных данных Swift

Я также полностью новичок в данных ядра. Я пытаюсь сохранить текст из UITextView. Как ни странно это работает, но только после того, как я удалить этот кусок кода,

if let detail: Note = self.detailItem { 

       if let textView = self.textView { 
        textView.text = detail.noteText 
       } 

создать новую заметку, а затем повторно ввести код ...

func configureView() { 
     // Update the user interface for the detail item. 
     if let detail: Note = self.detailItem { 
      if let label = self.detailDescriptionLabel { 
       label.text = detail.timeStamp.description 
      } 

     if let detail: Note = self.detailItem { 

      if let textView = self.textView { 
       textView.text = detail.noteText 
      } 

     } 
    } 

Для записки, которая уже была создана, это код может сохранять текст в текстовом элементе. Если я попытаюсь создать новую заметку, а затем откройте ее, код выше приведет к сбою приложения.

Эта ошибка появляется: Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0)

Я думаю, что я сделал глупую ошибку, как не инициализируется моя модель «Note.swift» класс.

Я использую шаблонный код для основного приложения с основными данными. У меня также есть две функции "insertNewObject". Один находится в MasterViewController, а другой - в DetailViewController.

DetailViewController.swift

func insertNewObject(sender: AnyObject) { 
     let context = self.fetchedResultsController.managedObjectContext 
     let entity = self.fetchedResultsController.fetchRequest.entity! 
     let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as! NSManagedObject 

Вот полный код включая fetchedResultsController.

func insertNewObject(sender: AnyObject) { 
     let context = self.fetchedResultsController.managedObjectContext 
     let entity = self.fetchedResultsController.fetchRequest.entity! 
     let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name!, inManagedObjectContext: context) as! NSManagedObject 

     // If appropriate, configure the new managed object. 
     // Normally you should use accessor methods, but using KVC here avoids the need to add a custom class to the template. 
     newManagedObject.setValue(self.textView.text, forKey: "noteText") 
     newManagedObject.setValue("I changed", forKey: "noteTitle") 

     // Save the context. 
     var error: NSError? = nil 
     if !context.save(&error) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      //println("Unresolved error \(error), \(error.userInfo)") 
      abort() 
     } 
    } 

    // MARK: - Fetched results controller 

    var fetchedResultsController: NSFetchedResultsController { 
     if _fetchedResultsController != nil { 
      return _fetchedResultsController! 
     } 

     let fetchRequest = NSFetchRequest() 
     // Edit the entity name as appropriate. 
     let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: self.managedObjectContext!) 
     fetchRequest.entity = entity 

     // Set the batch size to a suitable number. 
     fetchRequest.fetchBatchSize = 20 

     // Edit the sort key as appropriate. 
     let sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false) 
     let sortDescriptors = [sortDescriptor] 

     fetchRequest.sortDescriptors = [sortDescriptor] 

     // Edit the section name key path and cache name if appropriate. 
     // nil for section name key path means "no sections". 
     let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master") 
     aFetchedResultsController.delegate = self 
     _fetchedResultsController = aFetchedResultsController 

     var error: NSError? = nil 
     if !_fetchedResultsController!.performFetch(&error) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      //println("Unresolved error \(error), \(error.userInfo)") 
      abort() 
     } 

     return _fetchedResultsController! 
    }  

    var _fetchedResultsController: NSFetchedResultsController? = nil 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewWillDisappear(animated: Bool) { 
     detailItem!.noteText = self.textView.text 
     detailItem!.noteTitle = "I changed" 

     var error: NSError? = nil 
     if !self.managedObjectContext!.save(&error) { 
      abort() 
     } 
    } 
+0

В отладчике должно быть больше информации. Посмотрите в нижнем правом углу и дайте результат, например, «фатальная ошибка: неожиданно обнаружена нуль при разворачивании необязательного значения», поэтому мы уверены, с чем мы имеем дело. Например, detail.noteText может быть неявным образом развернутым. Необязательно – BaseZen

+0

Это то, что меня толкает, хотя в нижнем правом углу отладчика нет выхода, просто обычный (lldb) –

+0

Скриншот этого. Я всегда получаю больше полезной информации, чем исключение. Прокрутка или скрытая вкладка? – BaseZen

ответ

0

Я был в состоянии понять это. Проблема заключалась в том, что я не устанавливал значение для «noteText», когда я сначала вызывал func insertNewObject(sender: AnyObject). Это привело к тому, что ноль был установлен на textView.text и, следовательно, сбой приложения. Спасибо за помощь @BaseZen!