UITableView: la Poignée de sélection de cellule dans une cellule mixte table de vue statique et dynamique des cellules
Je suis en train de mélange statique et dynamique des cellules regroupés dans un tableau: je voudrais obtenir un deux sections avec des cellules statiques au sommet, suivi par un section de dynamique des cellules (veuillez vous référer à la capture d'écran ci-dessous). J'ai mis le tableau d'affichage du contenu de cellules statiques.
Modifier
Basé sur AppleFreak conseils, 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
Résiliation d'application en raison de uncaught exception
'NSInternalInconsistencyException', la raison: 'UITableView source de données
doit retourner une cellule de tableView:cellForRowAtIndexPath:'
pour la section 0 et la ligne 0. La cellule retourné à partir de 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 points de vente? Je n'ai pas mis toutes les sorties parce que je suis sous-classement UITableViewController
et soi-disant, ne sont pas prises pour tableview (?). Toutes les suggestions sur la meilleure façon de le faire?
Edition II
J'ai recréé ma scène dans un scénario (veuillez vous référer à ma mise à jour de la capture d'écran ci-dessus) et réécrit le point de vue du contrôleur afin de démarrer à partir d'une nouvelle base. J'ai aussi lu la description dans Apple forum applefreak suggéré. Cependant, je lance dans mon premier problème avec la méthode numberOfSectionsInTableView:tableView
, dans lequel je incrémenter le nombre de statique sections (deux) par un.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [super numberOfSectionsInTableView:tableView] + 1 ; }
L'application s'est écrasé avec le message d'erreur:
Résiliation d'application en raison de uncaught exception 'NSRangeException', la raison:
'*** -[__NSArrayI objectAtIndex:]: indice 2 au-delà des limites [0 .. 1]'
Pourquoi ce code ne fonctionne pas pour moi, même si j'ai suivi d'Apple et applefreak recommandations? Il est possible que la tableView a un peu changé dans iOS 6?
Solution: j'ai eu ce travail maintenant à l'aide de AppleFreaks exemple de code dans sa réponse ci-dessous. Merci, AppleFreak!
Modifier III: Sélection de Cellule:
Comment puis-je gérer de sélection de cellule dans un mélange (dynamique et statique des cellules) cellule de vue de la table?
Quand dois-je appeler super
et quand dois-je appeler self tableView
?
Lorsque j'utilise
[[super tableView] selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]
et essayez de vérifier l'index sélectionné chemins avec:
UITableView *tableView = [super tableView];
if ( [[tableView indexPathForSelectedRow] isEqual:customGrowthIndexPath] ) { .. }
J'obtiens une valeur de retour de nil
.
Que je ne peux pas trouver la source de mon erreur, je serait vraiment reconnaissant de votre aide
OriginalL'auteur AlexR | 2012-10-12
Vous devez vous connecter pour publier un commentaire.
Pour les cellules statiques vous devez appeler la méthode super. Je suppose que vous serez d'étendre UITableViewController. Voir ci-dessous
Aussi pour plus d'informations sur le mélange des cellules de voir De mélange statiques et dynamiques de la vue de la table de contenu de discussion sur les forums apple.
[MODIFIER]
Si vous n'avez pas lu apple lien ci-dessus alors s'il vous plaît le faire avec précaution. Pour le contenu dynamique vous permettra de construire la cellule première fois avec l'identifiant donné dans le code lui-même. La prochaine fois, sur les pupilles de vous retirer de la cellule plutôt que de construire! C'est la même vieille manière.
En outre, n'oubliez pas que la statique de la source de données pense que il y a seulement 2 sections(par exemple). Vous ne pouvez pas demander ça à propos de l'article 2, car il pense qu'il y a seulement les sections 0 et 1. Si vous allez à l'insertion dynamique de contenu n'importe où, mais à la fin de la table, vous avez besoin de mentir à super lorsque vous transférez les données de la source de méthodes. Votre numberOfRowsInSection: la méthode, par exemple, devrait ressembler à quelque chose comme ceci:
La clé est de rendre l'ajustement pour votre contenu dynamique, de sorte que la statique de la source de données obtient toujours les valeurs qu'il s'attend à ce
[MODIFIER]
Ici est l'exemple de travail et de tests. Il suffit de copier le passé toutes des méthodes suivantes dans votre code et il devrait fonctionner de manière droite. Vous devez remplacer toutes les tableview méthodes lorsque vous avez cellules mixtes. De retour, le nombre total de statique et de dynamique dans les sections "numberOfSectionsInTableView" selon vos besoins, puis dans chacun des autres méthodes; si la section ou de la ligne en question est statique appelez simplement par le biais de super, si c'est dynamique transmettre les détails pertinents comme vous le feriez dans un UITableViewController sous-classe. Dans cet exemple, je suis de retour à zéro, soit codé en dur valeurs.
Pour plus d'informations, consultez cette thread sur les forums apple.
[MODIFIER]
Vous n'appelez pas super en didSelectRowAtIndexPath. Il est simple. Voir code ci-dessous.
cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
retournenil
dans mon cas. Avez-vous une idée de ce que pourrait être le problème avec mon code? Pourrait-il y avoir tout foiré avec mon points de vente? Merci, applefreak!C'est étrange! J'ai fait exactement la même et cela a fonctionné sans aucun problème. Permettez-moi de vérifier et je reviendrai vers vous dès que possible. Il suffit de ne pas oublier de donner les identifiants. Vous n'avez pas besoin de vous inscrire cellules statiques si vous appelez Super ici. Avez-vous vu la pomme lien?
Je n'ai rien fait de différent! À partir de l'image que vous avez joint, il ne semble pas que vous avez 2 sections statiques? Ils sont trois? Et pour la Dynamique de cellules que vous n'avez pas besoin de les ajouter dans le XIB ou de la Scène. Vous pourrez le faire à partir du code. J'ai toutes les cellules statiques de type personnalisé avec des images différentes et labels. Je n'ai pas reuseidentifier d'installation pour les cellules statiques et ne peuvent pas s'inscrire de manière explicite. Il fonctionne de manière droite.
Comment définissez-vous le tableau de style de cellule après l'extraction d'une cellule avec
cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]
? Si vous ne définissez pas de votre dynamique (= prototype) des cellules dans Interface Builder, comment faites-vous cela dans le code? Comment attribuez-vous la réutilisation de l'identificateur de ces cellules? Merci!!!!modifié la réponse! C'est lourd mais c'est possible!
OriginalL'auteur applefreak
MIEUX & ENCORE plus FACILE Moyen de l'aide Personnalisé de la Dynamique des Cellules avec des Cellules Statiques:
1) Placez le Récipient dans la Vue d'en-Tête d'une Dynamique TableView
2) Attribuer la Statique de la TableView à ce Conteneur et Décocher le "Scrolling Activé"
OriginalL'auteur Mazen Kasser
Si il n'y a pas de cellule à retirer, puis de la cellule sera nul, et par conséquent, vous devez alloc/init un nouveau. S'il vous plaît, vérifiez la valeur de la cellule après que vous essayez de file d'attente, et de créer une nouvelle cellule si elle est nulle.
dequeueResusableCellWithIdentifier:forIndexPath
retourne toujours une instancié cellule: "type de Retour: Un UITableViewCell objet avec la réutilisation de l'identificateur. Cette méthode retourne toujours une cellule valide."Ok, ne savais pas que vous utilisiez iOS6 🙂
OriginalL'auteur khose
Merci applefreak pour comprehenisve réponse. Je vais ajouter ma suggestion ici que vous n'avez pas besoin de toute la section des calculs si vous ajoutez un mannequin sections de la statique. Vous pouvez même ajouter un espace réservé éléments de. De cette façon, vous n'avez pas à recréer
NSIndexPath
s. Une chose importante est de remplacer chaque méthode qui utiliseNSIndexPath
s comme ces crash de l'application en raison d'index de tableau d'incompatibilité.Aussi, j'ai renoncé à l'aide de la file d'attente mécanisme totalement et a créé la cellule de façon statique comme il n'y avait pas que de nombreuses cellules pour le contenu dynamique que j'ai eu. Cela rend
tableView:cellForRowAtIndexPath:
très simple.Rappelez-vous juste l'espace réservé sections.
Je suis de la création à la vue du contrôleur de
viewDidLoad
méthode. J'utiliseinitWithStyle:reuseIdentifier:
et de définir l'identifiant denil
comme il n'y a rien à réutiliser. Dans une autre partie de mon application, j'ai utiliser le tableau de la vuedequeueResusableCellWithIdentifier:forIndexPath
que la cellule est chargée à partir d'un fichier nib.Merci de sens, mais malheureusement je n'ai pas le temps de tester cela. Donc vous voulez dire par initWithStyle:reuseIdentifier vous pouvez créer des cellules.
Ouais, si par la coutume, de vous dire vide ou prédéfinies cellules. Cependant, je trouve ça beaucoup de fois plus facile à utiliser des classes de cellules avec des plumes quand il y a plus d'une sous-vue de la place.
OriginalL'auteur mkko
Seulement vous n'avez pas d'appel alloc.
Si vous ne souhaitez réutiliser, juste ne pas appeler dequeueReusableCellWithIdentifier.
OriginalL'auteur Evgeniy S
Cela peut être simplement résolu par l'ajout de "faux" sections pour ceux qui auront dynamique des cellules. La seule chose qui aura du changement est le cellForRowAt fonction, où vous résorption de la dynamique des cellules pour les "faux" sections au lieu de les laisser être utilisé à partir de ce que vous avez dans le storyboard. Et pour le reste des cellules u appel
Pas besoin de remplacer toutes les fonctions de la tableViewController
OriginalL'auteur Eddy