UISplitViewController
にUITableViewController
があります。請求書 UITableViewの一部でNSFetchedResultsControllerを使用
- アレイ
それでは、私はの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)
}
ここで間違っている可能性が何?
こんにちは、私は 'managedObjectContext'を保存する前に' self.tableView.reloadData() 'を呼び出し、直後に配列にデータを追加しました。しかし、私はまだ同じ問題を経験しています。 –
もう一度、はい、あなたは正しいです。それがエラーが発生した主な理由でした。今、私は 'self.tableView.reloadData'を呼び出す前に、FRCは変更とそのすべてがうまく動作していることに気づきます。ありがとう! –