2017-07-01 3 views
0

J'ai un tableaumeilleure configuration de DataSource pour UITableView avec les sections

secInfArr = [] 
    let secInf1 = SecInfObj.init() 
    secInf1.selected = true 
    secInf1.itemName = "item1" 
    secInf1.sectionName = "section3" 
    secInfArr.append(secInf1) 

    let secInf2 = SecInfObj.init() 
    secInf2.selected = true 
    secInf2.itemName = "item1" 
    secInf2.sectionName = "section1" 
    secInfArr.append(sectionInfo2) 

    let secInf3 = SecInfObj.init() 
    secInf3.selected = true 
    secInf3.itemName = "item1" 
    secInf3.sectionName = "section1" 
    secInfArr.append(secInf3) 

    let secInf4 = SecInfObj.init() 
    secInf4.selected = false 
    secInf4.itemName = "item1" 
    secInf4.sectionName = "section2" 
    secInfArr.append(secInf4) 

et je veux créer un tableView où tout ce contenu est regroupé par la propriété sectionName, et tous les itemName s qui sont dans cette section sont triés par ordre alphabétique.

Jusqu'à présent, je fais ce que je pense être inefficace. Je fais une opération Distinct sur la propriété sectionName dans le tableau, puis en l'utilisant pour nommer les sections et les compter. Après cela, dans la méthode CellForRowAtIndexPath je filtre juste le tableau en utilisant le sectionName, et ajoute les cellules.

J'ai également pensé utiliser NSFetchedResultsController mais je ne pense pas que ce soit une bonne idée, puisque les données ne sont pas persistantes dans la nature et n'ont donc pas besoin d'être dans un formulaire managedObject. Quelle est la manière idéale de structurer les données pour une vue groupée de table dans ce cas?

Répondre

0

Je suggère de les faire séparément en différents réseaux basés sur la section. Il est beaucoup plus facile d'être appelé dans la source de données en particulier pour les méthodes numberOfRowsInSection et cellForRowAt. Il est également facile pour UITableView d'obtenir des données pour chaque cellule puisqu'elle accède directement aux tableaux par son index.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if section == 0 { 
     return items0.count 
    } 
    else if section == 1 { 
     return items1.count 
    } 
    return 0 
} 

ou pourrait également être similaire à ci-dessous. Si tous sont en séparement items[0] ... items [n]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return items[section].count 
} 
1

Je recommande une solution orientée objet, par exemple une struct avec une propriété name et un tableau items, ici sous une forme générique.

struct Section<T> { 

    let name : String 
    var items = [T]() 

} 

Si le tableau items est muté utiliser fréquemment un class plutôt que d'un struct pour tirer parti de la sémantique de référence.

Lors du remplissage de la source de données, affectez les objets SecInfObj à l'instance Section appropriée.

Les articles peuvent être triés facilement, vous pouvez déclarer votre source de données

var data = [Section<SecInfObj>]() 

En numberOfRows retour

return data[section].items.count 

Vous obtenez la section par le chemin d'index avec

let section = data[indexPath.section] 

et puis les articles avec

let items = section.items[indexPath.row] 
+0

Merci pour la réponse, Vadian. Fondamentalement, je n'ai pas le contrôle sur les données, je le reçois dans le formulaire que j'ai décrit à partir du service Web. Quel est le moyen le plus efficace, sans imbriquer les boucles, de les convertir en Struct? – NSFeaster