2

コアデータからプルするように設定されたテーブル ビューがあります。テーブル ビューから削除すると、アプリがクラッシュし、次のエラー メッセージが表示されます

fatal error: unexpectedly found nil while unwrapping an Optional value

これが発生するコード行を把握しました。そのコード行の 2 つの文字列は両方とも nil です。したがって、何らかの理由で、削除後に fetchResultsController からプルすると、空の顧客がプルされます。顧客は削除されますが、クラッシュします。アプリのバックアップを開始すると、顧客は本来あるべき姿を失いました。

cell.textLabel!.text = (cust.valueForKey("firstName")! as! String) + " " + (cust.valueForKey("lastName")! as! String)

関連する残りの機能は次のとおりです。さらにコードが必要な場合はお知らせください。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell
{
    let cust = self.fetchResultsController.objectAtIndexPath(indexPath!)
    print("Cust: \(cust)")
    let cell =
    tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath!)
    print(cust.valueForKey("firstName"))
    print(cust.valueForKey("lastName"))
    cell.textLabel!.text = (cust.valueForKey("firstName")! as! String) + " " + (cust.valueForKey("lastName")! as! String)
    return cell
}

lazy var fetchResultsController:NSFetchedResultsController =
{
    var fetchRequest = NSFetchRequest(entityName:"Customer")
    print("fetchRequest\(fetchRequest)")
    let primarySortDescriptor = NSSortDescriptor(key: "lastName", ascending: true)
    let secondarySortDescriptor = NSSortDescriptor(key: "firstName", ascending: true)
    fetchRequest.sortDescriptors = [primarySortDescriptor,secondarySortDescriptor]
    let frc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: self.context,
        sectionNameKeyPath: nil,
        cacheName: nil)
    print(self.context)
    let fdrc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: self.context,
        sectionNameKeyPath: "first",
        cacheName: nil)
    self.fetchedResultsController = fdrc
    print("fetchedResultsController:\(self.fetchedResultsController)")
    return self.fetchedResultsController

}()
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
   let object:NSManagedObject = self.fetchedResultsController.objectAtIndexPath(indexPath)
   context.deleteObject(object)
   try! context.save()
   tableView.reloadData()
   //self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
}


func controllerDidChangeContent(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)
{
    tableView.deleteRowsAtIndexPaths(NSArray(object:indexPath!) as! [NSIndexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    tableView.reloadData()
}
4

1 に答える 1

0

問題は、すべての fetchedResultsControllerDelegate メソッドを実装していなかったことです。4 つのメソッドをすべて追加すると、削除は完全に機能しました。みんなの助けに感謝します。

于 2015-06-18T19:45:43.810 に答える