2017-06-05 14 views
-1

複数選択を有効にしたテーブルビューがあります。ユーザーは、リスト内の複数のオプションを選択してから、リストのソート順を変更することができます。同じセルを選択したままにしたいと思っていますが、その順序はソートから変更されています。私はこれを達成する方法を見ていないので、どんな提案も感謝しています。Swiftでテーブルビューを並べ替えた後、選択したセルを維持する

+0

は、なぜあなたは、プロパティを '持つカスタムセルを使用しないソートインデックス付き

、あなたは、元のインデックスの新しい位置に基づいて選択を再構築することができます選択された 'と、あなたが望む方法でそのプロパティを切り替える?そうすれば 'selected'プロパティを使ってテーブルビューをソートした後にどのセルが選択されたのか知ることができます。 –

+0

tableView.reloadData()を呼び出した後に、セルと同じ参照がありますか? – user2325848

答えて

0

データ構造に「選択済み」インジケータがある場合は、それを使用してtableView選択を再構築できます。

データにこのようなインジケータを追加できない場合は、1)新しい要素インデックスを計算し、2)データ配列にこれらのインデックスを適用して並べ替えを実行します。例えば

// Assuming your tableview is named "tableView", 
// and the data array is named "dataArray", 
// and you sort uses a member of dataArray called "sortKey" 


// prepare list of new indexes for sorted data 
let newIndexes = dataArray.enumerated().sorted{ $0.1.sortKey < $1.1.sortKey }.map{$0.0} 

// determine new indexes of current selection 
let newSelection = tableView.indexPathsForSelectedRows? 
        .map{IndexPath(row:newIndexes.index(of:$0.row)!, section:0)} 

// sort and reload the data        
dataArray  = newIndexes.map{ self.dataArray[$0] } 
tableView.reloadData() 

// reapply the selection 
tableView.indexPathsForSelectedRows?.forEach{tableView.deselectRow(at:$0, animated:false)} 
for indexPath in newSelection ?? [] 
{ self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none) } 
関連する問題