2017-06-05 1 views
-1

J'ai une vue de table avec la sélection multiple activée. Les utilisateurs sont censés pouvoir sélectionner plusieurs options dans une liste, puis modifier l'ordre de tri de la liste. Je voudrais être en mesure de garder les mêmes cellules sélectionnées, mais l'ordre d'entre eux aura changé de la sorte. Je ne vois pas de moyen d'y parvenir, donc toutes les suggestions sont appréciées.Conserver les cellules sélectionnées après avoir trié une vue de table dans Swift

+0

Pourquoi utilisez-vous pas des cellules personnalisées qui ont une propriété ' selected', et basculer cette propriété de la façon que vous voulez? De cette façon, vous saurez quelles cellules ont été sélectionnées après avoir trié la vue tabulaire en utilisant la propriété 'selected'. –

+0

Aurai-je la même référence aux cellules après avoir appelé tableView.reloadData()? – user2325848

Répondre

0

Si vous avez un indicateur "sélectionné" dans votre structure de données, vous pouvez l'utiliser pour reconstruire la sélection tableView.

Si vous ne pouvez pas ajouter un tel indicateur aux données, vous pouvez effectuer votre tri en deux étapes: 1) calculer les nouveaux index d'éléments, 2) appliquer ces index à votre tableau de données pour effectuer le tri.

Avec les index de tri, vous pouvez reconstruire la sélection basée sur le nouvel emplacement des indices originaux:

Par exemple:

// 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) }