37 votes

Combinaison de contenus statiques et prototypes dans une vue en tableau

Existe-t-il un moyen de combiner des cellules de tableaux statiques (contenu statique) avec des cellules de tableaux dynamiques (contenu prototype) en utilisant le storyboard ?

57voto

danh Points 21498

Je vous suggère de traiter votre tableau comme dynamique, mais d'inclure les cellules que vous voulez toujours en haut. Dans le Storyboard, placez un UITableViewController et lui faire utiliser une table dynamique. Ajoutez autant de UITableViewCell des prototypes au fur et à mesure de vos besoins. Disons, un pour chacune de vos cellules statiques, et un pour représenter les cellules variables.

Dans votre UITableViewDataSource classe :

#define NUMBER_OF_STATIC_CELLS  3

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.dynamicModel count] + NUMBER_OF_STATIC_CELLS;
}

et, alors

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row < NUMBER_OF_STATIC_CELLS) {
        // dequeue and configure my static cell for indexPath.row
        NSString *cellIdentifier = ... // id for one of my static cells
    } else {
        // normal dynamic logic here
        NSString *cellIdentifier = @"DynamicCellID"
        // dequeue and configure for [self.myDynamicModel objectAtIndex:indexPath.row]
    }
}

0 votes

C'est ce que j'ai fait il y a un an et je pense que c'est toujours la seule solution viable. J'espérais quelque chose de plus élégant, mais tant pis. Merci pour l'information.

1 votes

Dans le storyboard, dois-je définir le "Contenu" comme "Cellules statiques" ou "Cellules dynamiques" ?

0 votes

Dynamique. Il s'agit simplement d'un modèle dynamique dans lequel la source de données fournit certaines cellules sur la base d'un modèle fixe et d'autres sur la base d'un modèle dynamique.

12voto

AbuZubair Points 535

J'ai eu un problème, bien que ce soit une légère variante de celui-ci. Je voulais en fait mélanger des cellules dynamiques et statiques mais dans des groupes différents. C'est-à-dire que le groupe 1 aurait des cellules uniquement statiques et le groupe 2 aurait des cellules dynamiques.

J'y suis parvenu en codant en dur les valeurs des cellules statiques (sur la base de leurs identifiants de cellules prototypes). Les sections dynamiques auraient un contenu normal alimenté dynamiquement. Voici un exemple de code au cas où quelqu'un d'autre aurait le même problème :

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{    
    if (section == 1){
        return @"Dynamic Cells";
    }
    if (section == 0){
        return @"Static Cells";
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0) {
        return 1; //However many static cells you want
    } else {
        return [_yourArray count];
    }
}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    if (indexPath.section == 0) {
        NSString *cellIdentifier = @"staticCellType";   
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.textLabel.text = @"some static content";        
        return cell;

    } else if (indexPath.section == 1){

        NSString *cellIdentifier = @"dynamicCellType";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        cell.textLabel.text = [_yourArray objectAtIndex:indexPath.row];
        return cell;

    } 
    return nil;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

2 votes

C'est mieux que la réponse ci-dessus. Les contenus statiques et dynamiques peuvent se trouver dans des sections différentes.

0 votes

C'est techniquement du contenu dynamique. Vous renvoyez toujours le contenu statique de manière dynamique, même s'il ne change pas strictement. "Statique" dans le UITableView Le sens fait référence aux tableaux qui ont été mis en page à l'aide d'Interface Builder. Il existe cependant un moyen de mélanger le contenu statique et dynamique. Pour ce faire, vous devez surcharger un certain nombre de méthodes UITableViewDataSource.

0 votes

Une solution parfaite. Merci beaucoup. D'ailleurs, vous n'avez même pas besoin de créer la vue/contrôleur/cellule sur le constructeur d'interface de cette façon. Vous pouvez simplement le faire par code. Merci !

3voto

lnafziger Points 18241

Malheureusement, ce n'est pas possible car les vues de tables statiques doit être dans un UITableViewController et qui ne permet qu'une seule tableview.

Ce que vous devez faire, c'est créer trois autres UITableviewCell dynamiques et les charger individuellement pour les trois premières rangées où vous voulez le contenu statique.

Si vous n'êtes pas sûr de savoir comment faire, faites-le moi savoir et je peux trouver un code.

1 votes

C'est juste, et vous ne perdez pas grand-chose. Vous devrez de toute façon renvoyer manuellement les cellules statiques à partir de tableView:cellForIndexPath :, il vous suffira donc de le faire en utilisant l'identifiant de la cellule au lieu d'établir une connexion IBOutlet/property. La plus grande perte est que vous ne serez pas en mesure de lier automatiquement les champs de texte individuels aux propriétés, mais si vous marquez tout, vous devriez être en mesure de le faire dans viewDidLoad.

3voto

Michael Points 453

Vous pouvez toujours faire en sorte que l'une de vos tablesviews ressemble à la table statique, mais définissez-la dans le code. Définissez les sections, le nombre de lignes par section, les en-têtes, etc. à l'aide des méthodes de délégation.

2voto

T.J. Points 2711

Vous ne pouvez pas avoir un tableau statique et un autre dynamique dans le même contrôleur de vue, vous devrez donc les rendre tous les deux dynamiques. Dans le premier tableau, vous configurerez les cellules dans le code lors de l'initialisation du contrôleur de vue, sans jamais les mettre à jour.

  1. Ajoutez un UIViewController à votre storyboard.
  2. Ajouter deux vues de table (non TableViewControllers) au contrôleur UIView.
  3. Sélectionnez chaque tableView et configurez les deux pour les cellules dynamiques.
  4. Construisez et attachez votre contrôleur de vue. 2 tablesview sur une seule vue explique cette étape.

Vous pouvez également obtenir un aspect similaire en intégrant votre tableau dynamique dans une partie d'une vue similaire au lien de l'étape 4, puis en faisant ce que vous voulez dans le reste de la vue pour configurer ce que vous aviez prévu de faire avec des cellules statiques en utilisant des vues défilantes, des étiquettes et des boutons.

0 votes

Malheureusement, ce n'est pas possible. J'ai besoin de trois cellules statiques, puis de cellules dynamiques en dessous qui pourraient accueillir de 12 à 33 personnes. J'ai déjà réalisé ce projet en code, mais j'aime beaucoup le storyboard et j'espérais pouvoir en faire autant.

0 votes

Pour une raison quelconque, je n'ai pas pensé à essayer ça. Merci. Je vais me pencher sur l'utilisation de deux contrôleurs de vue pour les deux tables. Cela semble logique.

0 votes

Je ne crois pas que ce soit une possibilité. Je peux compiler et exécuter l'application, mais le contenu statique ne s'affiche pas. J'obtiens cette erreur : "Les vues de table statiques ne sont valables que lorsqu'elles sont intégrées dans des instances UITableViewController". Il s'avère que les UITableViewControllers offrent une certaine magie au contenu statique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X