6
votes

Uitailview: en-têtes de section imbriqués

im essayant de mettre en œuvre un utableview avec la structure suivante:

  • section de section 0
    • Section 0
      • cellule 0
      • Cell 1
      • Cell 2
      • Section 1
        • cellule 0
        • Cell 1
        • Cell 2
        • section groupe 1
          • Section 0
            • cellule 0
            • Cell 1
            • Cell 2
            • Section 1
              • cellule 0
              • Cell 1
              • Cell 2

                Et il devrait scanner comme cette capture d'écran (1-2-3-4): http://dl.dropbox.com/u/2213241/ittableview.png

                Donc, toujours deux sections sont visibles.

                Comment puis-je implémenter cela? Ou quelqu'un a-t-il déjà mis en œuvre cela?

                merci :)


3 commentaires

Eh bien, ma question est que vous voulez mettre en œuvre quelque chose comme ça?


Oui j'ai essayé de la mettre en œuvre mais j'ai pu comprendre comment. Donc, je croyais que quelqu'un plus intelligent que moi ait une idée;)


Ce n'est pas difficile à réaliser, mais pas aussi simple, peut être que vous pouvez commencer par sous-classement de la vue utilitaire et poster une question connexe


3 Réponses :


2
votes

sous-classement utableview serait une bonne option, comme Robin suggéré. J'ai fait quelque chose de similaire à cela moi-même, mais j'ai sous-classé utableviewcell et placé utableview s à l'intérieur d'eux. Dans ce cas, vous auriez une table de baseviette où chaque section serait un groupe. Chaque ligne, car votre sous-classe utableviewCell est alors son propre utableview , qui a ses propres sections et lignes. Cela devrait vous donner le look et la fonctionnalité que vous recherchez. Je serais heureux d'aider à la configurer si vous avez du mal à le faire en place, mais ce n'est pas trop difficile à faire. Ce didacticiel donne un bon exemple sur la sous-classe UitailViewCell et est un bon endroit pour commencer


3 commentaires

Quelque chose comme ça: iOSSTFF.WordPress.com / 2011/06/29 / ... ?


Yup, cela devrait fonctionner très bien. Il peut également être fait par programmation si vous ne voulez pas utiliser IB. Il suffit de configurer votre site WebView et d'autres variables dans votre fichier d'en-tête et créez la tableView dans votre initwithstyle de votre cellule personnalisée: réutilisateur: méthode. Le reste du code sera le même, mais c'est ainsi que vous allez y aller si vous ne voulez pas créer de fichier NIB pour votre cellule personnalisée.


C'est quelque chose d'intéressant et de créativité imo. Merci d'avoir partagé



4
votes

Le truc pour avoir des sections imbriquées est d'avoir deux types de lignes dans la vue Table. Un pour représenter le deuxième niveau de sections et une autre pour représenter les lignes normales dans la tableView. Disons que vous avez un tableau de deux niveaux (disons des sections) pour représenter les éléments de votre vue table.

Ensuite, le nombre total de sections que nous avons n'est que du nombre de sections de niveau supérieur. Le nombre de lignes dans chaque section de niveau supérieur serait le nombre de sous-sections + le nombre de lignes dans chaque sous-section. P> xxx pré>

maintenant, tout ce que nous devons penser à faire Créez les lignes pour la vue de la table. Configurez deux prototypes dans le storyboard avec des identifiants de réutilisation différentes, une pour l'en-tête de section et une autre pour l'élément de ligne et simplement instancier la bonne sur la base de l'index de la source de données dans la méthode source de données. P>

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSMutableArray *sectionItems = self.sections[(NSUInteger) indexPath.section];
    NSMutableArray *sectionHeaders = self.sectionHeaders[(NSUInteger) indexPath.section];
    NSIndexPath *itemAndSubsectionIndex = [self computeItemAndSubsectionIndexForIndexPath:indexPath];
    NSUInteger subsectionIndex = (NSUInteger) itemAndSubsectionIndex.section;
    NSInteger itemIndex = itemAndSubsectionIndex.row;

    if (itemIndex < 0) {
        // Section header
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SECTION_HEADER_CELL" forIndexPath:indexPath];
        cell.textLabel.text = sectionHeaders[subsectionIndex];
        return cell;
    } else {
        // Row Item
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ROW_CONTENT_CELL" forIndexPath:indexPath];
        cell.textLabel.text = sectionItems[subsectionIndex][itemIndex];
        return cell;
    }
}

- (NSIndexPath *)computeItemAndSubsectionIndexForIndexPath:(NSIndexPath *)indexPath {
    NSMutableArray *sectionItems = self.sections[(NSUInteger) indexPath.section];
    NSInteger itemIndex = indexPath.row;
    NSUInteger subsectionIndex = 0;
    for (NSUInteger i = 0; i < sectionItems.count; ++i) {
        // First row for each section item is header
        --itemIndex;
        // Check if the item index is within this subsection's items
        NSArray *subsectionItems = sectionItems[i];
        if (itemIndex < (NSInteger) subsectionItems.count) {
            subsectionIndex = i;
            break;
        } else {
            itemIndex -= subsectionItems.count;
        }
    }
    return [NSIndexPath indexPathForRow:itemIndex inSection:subsectionIndex];
}


1 commentaires

J'ai le problème similaire, mais un niveau plus de toute aide est d'apprécier Stackoverflow.com/q/45626816/6028575



3
votes

Si quelqu'un est intéressé par une version SWIFT 4.2 du code ci-dessus, c'est.

Pour avoir des sections imbriquées, vous devez disposer de plusieurs types de lignes dans votre TableView. Premièrement, représenter le deuxième niveau de sections et deuxième pour représenter les lignes standard de votre site WebView. Disons que vous avez un tableau à deux niveaux (sections) pour représenter les éléments de votre site WebView. P>

Ensuite, le nombre total de sections que nous avons ne sont que le nombre de sections de niveau supérieur. Le nombre de lignes dans chaque section de niveau supérieur serait le nombre de sous-sections + le nombre de lignes dans chaque sous-section. P> xxx pré>

maintenant, tout ce que vous devez penser est comment Pour créer les lignes pour la vision de la table. Configurez deux prototypes dans le storyboard avec des identifiants de réutilisation différentes, une pour l'en-tête de section et une autre pour l'élément de ligne et simplement instancier la bonne sur la base de l'index de la source de données dans la méthode source de données. P>

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var sectionItems = sections[indexPath.section]
    var sectionHeaders = self.sectionHeaders[indexPath.section]
    let itemAndSubsectionIndex: IndexPath? = computeItemAndSubsectionIndex(for: indexPath)
    let subsectionIndex = Int(itemAndSubsectionIndex?.section ?? 0)
    let itemIndex: Int? = itemAndSubsectionIndex?.row

    if (itemIndex ?? 0) < 0 {
        // Section header
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "SECTION_HEADER_CELL", for: indexPath)
        cell.textLabel?.text = sectionHeaders[subsectionIndex] as? String
        return cell
    } else {
        // Row Item
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "ROW_CONTENT_CELL", for: indexPath)
        cell.textLabel?.text = sectionItems[subsectionIndex][itemIndex ?? 0] as? String
        return cell
    }
}

func computeItemAndSubsectionIndex(for indexPath: IndexPath?) -> IndexPath? {
    var sectionItems = sections[Int(indexPath?.section ?? 0)]
    var itemIndex: Int? = indexPath?.row
    var subsectionIndex: Int = 0
    for i in 0..<sectionItems.count {
        // First row for each section item is header
        itemIndex = (itemIndex ?? 0) - 1
        // Check if the item index is within this subsection's items
        let subsectionItems = sectionItems[i] as? [Any]
        if (itemIndex ?? 0) < Int(subsectionItems?.count ?? 0) {
            subsectionIndex = i
            break
        } else {
            itemIndex -= subsectionItems?.count
        }
    }
    return IndexPath(row: itemIndex ?? 0, section: subsectionIndex)
}


1 commentaires

Comment les variables sont-elles déclarées? Pouvez-vous donner un exemple?