3 votes

UITableView : Gérer la sélection des cellules dans une vue mixte de tableau de cellules statiques et dynamiques

J'essaie de mélanger des cellules dynamiques et statiques dans une vue de tableau groupé : J'aimerais obtenir deux sections avec des cellules statiques en haut, suivi d'un section des cellules dynamiques (veuillez vous référer à la capture d'écran ci-dessous). J'ai défini le contenu de la vue tableau à cellules statiques .

Mixing dynamic and static table view cells

Editar

Sur la base des conseils d'AppleFreak, j'ai modifié mon code comme suit :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell;
    if (indexPath.section <= 1) { // section <= 1 indicates static cells
        cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 
    } else { // section > 1 indicates dynamic cells
        CellIdentifier = [NSString stringWithFormat:@"section%idynamic",indexPath.section];
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
return cell;

}

Cependant, mon application se bloque avec le message d'erreur

Terminer l'application en raison d'une exception non attrapée NSInternalInconsistencyException', reason : 'UITableView dataSource doit renvoyer une cellule de tableView:cellForRowAtIndexPath:'.

pour la section 0 et la ligne 0. La cellule renvoyée par la fonction cell = [super tableView:tableView cellForRowAtIndexPath:indexPath] pour la section 0 et la ligne 0 est nil .

Quel est le problème avec mon code ? Pourrait-il y avoir des problèmes avec mes prises ? Je n'ai pas défini de points de vente parce que j'ai sous-classé la classe UITableViewController et il n'y a apparemment aucun débouché pour que la tableview soit définie ( ?). Avez-vous des suggestions sur la meilleure façon de procéder ?

enter image description here

Edit II

J'ai recréé ma scène dans le storyboard (veuillez vous référer à ma capture d'écran mise à jour ci-dessus) et réécrit le contrôleur de vue afin de partir d'une nouvelle base. J'ai également lu la description dans le forum d'Apple comme applefreak l'a suggéré. Cependant, je me heurte à mon premier problème avec la méthode numberOfSectionsInTableView:tableView dans lequel j'incrémente d'une unité le nombre de sections statiques (deux).

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [super numberOfSectionsInTableView:tableView] + 1 ; }

L'application a planté avec le message d'erreur :

Terminer l'application en raison d'une exception non attrapée 'NSRangeException', raison : '*** -[__NSArrayI objectAtIndex :]: index 2 beyond bounds [0 .. 1]''

Pourquoi ce code ne fonctionne-t-il pas pour moi alors que j'ai suivi les recommandations d'Apple et d'applefreak ? Est-il possible que le tableView ait un peu changé dans iOS 6 ?

Solution : J'ai réussi à le faire fonctionner maintenant en utilisant l'exemple de code d'AppleFreaks dans sa réponse ci-dessous. Merci, AppleFreak !

Edit III : Sélection des cellules :

Comment puis-je gérer sélection des cellules dans une vue de tableau de cellules mixte (cellules dynamiques et statiques) ? Quand dois-je appeler super et quand dois-je appeler self tableView ? Lorsque j'utilise

[[super tableView] selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]

et essayer de vérifier les chemins d'index sélectionnés avec :

UITableView *tableView = [super tableView];
if ( [[tableView indexPathForSelectedRow] isEqual:customGrowthIndexPath] ) { .. }

J'obtiens une valeur de retour de nil .

Comme je n'arrive pas à trouver la source de mon erreur, j'apprécierais vraiment votre aide.

0voto

Eddy Points 42

Ceci peut être résolu simplement par l'ajout de "fausses" sections pour ceux qui auront des cellules dynamiques. La seule chose qui devra être modifiée est la fonction cellForRowAt, où vous mettez en file d'attente les cellules dynamiques pour les "fausses" sections au lieu de les laisser être utilisées à partir de ce que vous avez dans le storyboard. Et pour le reste des cellules, vous appelez

super.tableView(tableview, cellforRowAt: indexPath)

Il n'est pas nécessaire de surcharger toutes les fonctions du tableViewController.

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