2015-10-22 5 views
0

Я пытаюсь преобразовать рабочий стол в представление таблицы с использованием NSFetchedResultsController.Пытается преобразовать в NSFetchedResultsController «Неустранимая ошибка: неожиданно найдено нуль при распаковке необязательного значения»?

Я проверяю только с двумя записями, и это является частью моего рабочего кода

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
let fetchRequest = NSFetchRequest(entityName: "Appointments") 
     //3 
     do { 
      self.tableView.reloadData() 
      let results = try context.executeFetchRequest(fetchRequest) 
      invoices = results as Array<AnyObject> //cast to Appointments didn't work   
     } catch let error as NSError { 
      print("Could not fetch \(error), \(error.userInfo)") 
     } 

И это часть моего преобразования кода

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

var frc: NSFetchedResultsController = NSFetchedResultsController() 

func getFetchedResultsController()->NSFetchedResultsController { 
    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    return frc 
} 

func listFetchRequest()->NSFetchRequest{ 
    let fetchRequest = NSFetchRequest(entityName: "Appointments") 
    let sortDescriptor = NSSortDescriptor(key: "appointmentUser", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor] 
    return fetchRequest 
} 

var appointments = [AnyObject]()//[NSManagedObject]() 

Он строит успешно, но я сразу получаю сообщение об ошибке: фатальная ошибка: неожиданно обнаружена нуль при развертывании a Необязательное значение

libswiftCore.dylib`function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) ->(): 
0x1002c0a50 <+0>: stp x29, x30, [sp, #-16]! 
0x1002c0a54 <+4>: mov x29, sp 
0x1002c0a58 <+8>: sub sp, sp, #16 
0x1002c0a5c <+12>: and w8, w2, #0x1 
0x1002c0a60 <+16>: tbnz w8, #0, 0x1002c0a80  ; <+48> 
0x1002c0a64 <+20>: tbnz x1, #63, 0x1002c0ac4  ; <+116> 
0x1002c0a68 <+24>: add x1, x0, x1 
0x1002c0a6c <+28>: mov x2, x3 
0x1002c0a70 <+32>: mov x3, x4 
    0x1002c0a74 <+36>: mov x4, x5 
    0x1002c0a78 <+40>: bl  0x10030d910    ; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded> of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) ->()).(closure #2) 
-> 0x1002c0a7c <+44>: brk #0x1 
    0x1002c0a80 <+48>: str xzr, [sp, #8] 
    0x1002c0a84 <+52>: cmp x0, w0, uxtw 

Как я могу проверить, где происходит разворачивание? Как я могу это исправить?

[EDIT] С некоторых проб и ошибок (outcommenting части) я думаю, что это имеет отношение к этой части моего кода

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
//  return 1 
     let numberOfSections = frc.sections?.count 
     return numberOfSections! 
    } 

Смотри также: NSFetchedResultsController swift sections

+0

Почему вы объявляете 'invoices' как' [AnyObject] ', хотя это, несомненно,' [NSManagedObject] '. Чем более конкретный код разработан, тем меньше ошибок/предупреждений компилятора и даже сбоев вы получаете. - 'invoices = try context.executeFetchRequest (fetchRequest) как! [NSManagedObject] '. Если возникнет какая-либо ошибка, она будет обнаружена правильно. – vadian

+0

если я прихожу к Назначениям Я получаю фатальную ошибку: элемент NSArray не соответствует типу элемента Swift Array – alex

+0

Хорошо, мне пришлось добавить идентификатор класса в файл модели, а также посмотреть http://stackoverflow.com/questions/31304638/fetchrequest -nsarray-element-failed-to-match-the-swift-array-element-type-sw , но все еще frc не работает должным образом – alex

ответ

1

Проблема с этой частью кода:

// issue 1 
var frc: NSFetchedResultsController = NSFetchedResultsController() 

// issue 2 
func getFetchedResultsController()->NSFetchedResultsController { 
    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil) 
    return frc 
} 

Выпуск 1: NSFetchedResultsController в настоящее время экземпляр (но не сконфигурирован) и хранится в frc.

выпуск 2: функция создает новый, сконфигурированный, NSFetchedResultsController (и сохраняет его в frc) каждый раз, когда он вызывается.

Я думаю, что вы пытаетесь достичь здесь ленив конкретизации, удалите функцию getFetchedResultsController и заменить объявление переменной с этим:

lazy var frc: NSFetchedResultsController = { 
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: self.listFetchRequest(), managedObjectContext: self.context, sectionNameKeyPath: nil, cacheName: nil) 
    fetchedResultsController.delegate = self 
    return fetchedResultsController 
}() 

Это устанавливает контроллер надуманными результаты, когда свойство frc первого обращения и назначить делегата как self.

на основе ваших комментариев метод viewDidLoad будет выглядеть примерно так:

override func viewDidLoad() { 
    super.viewDidLoad() 

    do { 
     try self.frc.performFetch() 
    } catch { 
     ... 
    } 
} 
+0

hmmm, я получаю сообщение об ошибке «Отсутствует аргумент для параметра № 1 при вызове» когда я использую ваш ленивый экземпляр – alex

+1

@alex Я обновил свой ответ, ему нужно ссылаться на 'self' –

+0

, что ваша новая функция построила, но не исправила мою проблему. Мне пришлось заменить этот код 'frc = getFetchedResultsController() frc.delegate = self do { try frc.performFetch() } catch { print (ошибка) } 'to viewDidLoad. У меня был код в viewDidAppear – alex

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

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