1

CoreDataのエンティティをNSFetchedResultsControllerで表示するUICollectionViewがあります。スクリーンショットでわかるように、ユーザーは境界線でマークされた複数のセルを選択できます。UICollectionView + NSFetchedResultsController内のセルを並べ替える

Screenshot

私のモデルは基本的にUICollectionViewを経由して選択を処理するための単なる文字列やブール値を持っています。

var url: String 
var selected: Bool 
var section:Section 

私はUICollectionViewCellsの並べ替えをサポートするためにfunc collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)を実装しています。ドラッグアンドドロップ操作はうまくいきますが、移動したアイテムをCoreDataに保存するのには苦労しています。モデルにpositionプロパティを追加する必要がありますか?

func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { 
    var sourceArray = self.fetchedResultController.fetchedObjects 
    let item = sourceArray?.remove(at: sourceIndexPath.item) 
    sourceArray?.insert(item!, at: destinationIndexPath.row) 
    coreData.saveContext() 
} 

私は、このプロパティは読み取り専用ですので、wokringされていない、直接​​を修正しようとしました。どのような最善の方法は&をドロップするUICollectionViewNSFetchedResultsControllerとドロップします。

EDIT:UICollectionView

初期ソートがSectionモデルのインデックスプロパティに基づいています。現在、セクションのソートキーだけがあり、セクション内のアイテムはありません。

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "section.index", ascending: false)] 
let resultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath:"section.name", cacheName: nil) 
+0

どのようにアイテムを並べ替えてコレクションビューに表示するのですか? –

+0

質問を更新しました。セクションのソートは、セクションモデルのプロパティに基づいています。 – nor0x

答えて

1

あなたが見つけてきたように、あなただけのfetchedObjects配列内のオブジェクトの順序を変更するにはNSFetchedResultsControllerを伝えることはできません。その配列はソート記述子に基づいてソートされ、読み取り専用です。新しいソート結果は、ドラッグの結果と一致し、操作をドロップするように、

  1. 変更するには、ソートディスクリプタに使用しているプロパティ:

    だから、あなたは、2つの可能なオプションがあります。変更を保存すると、NSFetchedResultsControllerデリゲートメソッドが起動します。注文を変更しました。取り出された結果コントローラはその配列をfetchedObjects配列に反映します。
  2. NSFetchedResultsControllerを使用しないでください。フェッチして結果を独自の配列に保存してください。自分の配列内の項目を並べ替えますが、Core Dataが気にするものは変更しないでください。
関連する問題