2016-04-08 6 views
0

UISplitViewControllerUITableViewControllerがあります。請求書 UITableViewの一部でNSFe​​tchedResultsControllerを使用

  • Customerオブジェクトの

    1. アレイ

    それでは、私はのUITableViewの最初のセクション(またはSection 0)で請求書の詳細を移入されてやっている:このtableViewControllerは2つのことを受け取ります。

    invoice == nilを持つ顧客のすべてのプロパティを取得し、それをテーブルビューの2番目のセクションに表示するには、NSFetchedResultsControllerを使用しています。

    したがって、基本的にUITableViewControllerの一部にのみNSFetchedResultsControllerを使用していますが、全体ではありません。

    今、すべて正常に動作します。しかし、セクション2の行をタップすると、そのユーザーに新しい請求書にpropertyを追加するように指示します。私がそれをすると、私はこのエラーになります:

    CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null) 
    

    なぜ起こっているのか分かりません。私はfetchedResultsControllerがセクション0を期待していることを理解していますが、手動でセクション1のみを使用するよう強制されています。

    参照用のコードは次のとおりです。

    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
        switch (type) { 
        case .Insert: 
         if let indexPath = newIndexPath { 
          let editedNewIndexPath = NSIndexPath(forRow: indexPath.row, inSection: 1) 
          tableView.insertRowsAtIndexPaths([editedNewIndexPath], withRowAnimation: .Fade) 
         } 
         break; 
        case .Delete: 
         if let indexPath = indexPath { 
          let editedCurrentIndexPath = NSIndexPath(forRow: indexPath.row, inSection: 1) 
          tableView.deleteRowsAtIndexPaths([editedCurrentIndexPath], withRowAnimation: .Fade) 
         } 
         break; 
        case .Update: 
         if let indexPath = indexPath { 
          let editedCurrentIndexPath = NSIndexPath(forRow: indexPath.row, inSection: 1) 
          if let cell = tableView.cellForRowAtIndexPath(editedCurrentIndexPath){ 
           configureCell(cell, atIndexPath: editedCurrentIndexPath) 
           //tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: .None) 
          } 
         } 
         break; 
        case .Move: 
         if let indexPath = indexPath { 
          let editedCurrentIndexPath = NSIndexPath(forRow: indexPath.row, inSection: 1) 
          tableView.deleteRowsAtIndexPaths([editedCurrentIndexPath], withRowAnimation: .Fade) 
         } 
    
         if let newIndexPath = newIndexPath { 
          let editedNewIndexPath = NSIndexPath(forRow: newIndexPath.row, inSection: 1) 
          tableView.insertRowsAtIndexPaths([editedNewIndexPath], withRowAnimation: .Fade) 
         } 
         break; 
        } 
    } 
    
    // MARK: - Table view data source 
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
        return 2 
    } 
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
        if section == 0{ 
         if let ivData = self.invoices{ 
          print("Section0 - \(ivData.count)") 
          return ivData.count 
         } 
        } 
        else if section == 1{ 
         if let sections = fetchedResultsController.sections { 
          let sectionInfo = sections[0] 
          print("Section1 - \(sectionInfo.numberOfObjects)") 
          if sectionInfo.numberOfObjects > 0{ 
           return sectionInfo.numberOfObjects 
          } 
          else{ 
           return 1 
          } 
         } 
        } 
        return 0 
    } 
    

    新しい請求書を保存するためのコードは次のとおりです。

    do{ 
            self.invoices!.append(billRecord as! InvoiceInfo) 
            try billRecord.managedObjectContext?.save() 
            try self.customer!.managedObjectContext?.save() 
            try record.managedObjectContext?.save() 
            //self.lookUpLotsWithoutBills() 
            self.tableView.reloadData() 
    
           } 
           catch{ 
            self.invoices!.removeObject(ivRecord) 
            let alertController = UIAlertController(title: "Unexpected Error", message: "Your data could not be updated. Please try again later.", preferredStyle: .Alert) 
            alertController.addAction(UIAlertAction(title: "Done", style: .Cancel, handler: nil)) 
            self.presentViewController(alertController, animated: true, completion: nil) 
           } 
    

    ここで間違っている可能性が何?

  • 答えて

    0

    あなたのFRCは正常に動作しているようですが、コードはセクション0に追加される新しい請求書行についてテーブルビューに伝えていません。それは正確にはわかりませんが、私は推測するつもりですFRCは請求書を追加した後で、テーブルのデータをリロードする前に更新を実行するためです。その時点では、セクション0の行数は間違っていて、テーブルについて言わなかったことになります。

    +0

    こんにちは、私は 'managedObjectContext'を保存する前に' self.tableView.reloadData() 'を呼び出し、直後に配列にデータを追加しました。しかし、私はまだ同じ問題を経験しています。 –

    +0

    もう一度、はい、あなたは正しいです。それがエラーが発生した主な理由でした。今、私は 'self.tableView.reloadData'を呼び出す前に、FRCは変更とそのすべてがうまく動作していることに気づきます。ありがとう! –

    関連する問題