2017-05-10 4 views
0

を更新していない配列要素の名前は私がNSFetchedResultsControllerの簡単な使用法を持っていることは、この不自然な例のようなものを定義し、彼らが持っているクラスでのセクションにグループ化された学生のエンティティを表示するには、テーブルビューを助けNSFetchedResultsControllerのセクションが正しく

let request: NSFetchRequest<StudentEntity> = StudentEntity.fetchRequest() 
    request.sortDescriptors = [ 
    NSSortDescriptor(key: "class.name", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))) 
    ] 

fetchedResultsController = NSFetchedResultsController<StudentEntity>(
    fetchRequest: request, 
    managedObjectContext: context, 
    sectionNameKeyPath: "class.name", 
    cacheName: nil) 

彼らのクラス関係に設定されています。クラスエンティティにはname属性があり、sectionNameKeyPathはclass.nameです。

生徒が参照するクラスを編集すると、テーブルのデータをリロードしようとしましたが、残念ながら私が使っていたセクション名が更新されていないことがわかりました。多くのデバッグでは、もちろんクラスエンティティが正常に更新されていることがわかりますが、何らかの理由でセクション[]。nameが更新されていません。正しく

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
{ 
    let sectionInfo = fetchedResultsController!.sections![section] 
    let sectionTitle = sectionInfo.name 
    let sectionStudentEntity = sectionInfo.objects![0] as! StudentEntity 
    let sectionTitleFromStudent = sectionStudentEntity.class!.name! 

しかしsectionTitleが更新されませんを実行し、sectionTitleFromStudentとして正しく古いクラ​​ス名を表示するには、次のデータ・ソースの方法を起こし

classEntity.name = newClassName 

do 
{ 
    try context.save() 
} 
catch let error 
{ 
    dbgLog("failed to save context; error=\(error)") 
} 

tableView.reloadData(); 

を次のように私は、クラス名を更新します更新された新しいクラス名が表示されます。

sectionNameKeyPathはネストされたパスであり、クラスエンティティは更新されていますが、fetchedResultsControllerは何らかの形で学生エンティティ自体の変更を検出しないため、これらのセクション名を再作成しないためです。バグのような感じですが、うまくいけば、正しく更新されたsectionTitleFromStudent文字列を使用して回避できます。

誰もがアイデアを持っている、または同じ問題を抱えている人は誰ですか?

乾杯

+0

'reloadData'の前に' performFetch'をやってみましたか? – pbasdf

+0

私はそれを試していなかったし、それを試して実際に問題を修正しました。私は、それがリンクされているエンティティだけの依存関係を検出することはできませんね。ありがとうございました。あなたが答えとしてそれを載せたいなら、私はそれを受け入れます。乾杯! – jimbobuk

答えて

1

FetchedResultsControllerだけそのフェッチ(あなたのケースでStudentオブジェクト)を基礎となるエンティティのオブジェクトへの変更を観察します。したがって、関連するClassオブジェクトの属性の変更は認識されません。これを認識させるには、performFetchを再実行して、フェッチしたオブジェクトとセクションを更新する必要があります。 (performFetchは通常のFRC変更トラッキングをバイパスするので、FRCデリゲートメソッドは起動しませんが、テーブルビューで完全なreloadDataを実行しているので問題はありません)。

関連する問題