Совершенно новый для разработки 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()
}
}
В отладчике должно быть больше информации. Посмотрите в нижнем правом углу и дайте результат, например, «фатальная ошибка: неожиданно обнаружена нуль при разворачивании необязательного значения», поэтому мы уверены, с чем мы имеем дело. Например, detail.noteText может быть неявным образом развернутым. Необязательно – BaseZen
Это то, что меня толкает, хотя в нижнем правом углу отладчика нет выхода, просто обычный (lldb) –
Скриншот этого. Я всегда получаю больше полезной информации, чем исключение. Прокрутка или скрытая вкладка? – BaseZen