2009-12-11 6 views
0

J'implémente un UITableView où le nombre de lignes pour une section donnée est limité à 4. D'ailleurs, si le nombre de lignes est inférieur à 4, j'ajoute une ligne qui est utilisé comme espace réservé pour l'élément suivant à ajouter (similaire à l'application "Contacts").Section UITableView avec le nombre maximal de lignes

J'ai un problème lorsque j'atteins le nombre maximum de lignes pour la section. Si je tente de supprimer un objet de cette section, je reçois l'exception suivante:

en raison de l'application Mettre fin exception uncaught « NSInternalInconsistencyException », motif: « mise à jour invalide: numéro incorrect de lignes dans la section 1. Le nombre des lignes contenues dans une section existante après la mise à jour (4) doit être égal au nombre de lignes contenues dans cette section avant la mise à jour (4), plus ou moins le nombre de lignes insérées ou supprimées de cette section (0 inséré, 1 supprimé). '

Bien sûr, le problème est que retourne mes méthodes numberOfRowsInSection N + 1 si le nombre de lignes est inférieur à 4 (une cellule supplémentaire pour l'espace réservé), ce qui déclenche cette exception d'incohérence.

Y a-t-il un endroit autour de ça?

Répondre

2

J'ai rencontré un problème similaire parce que je fournis une ligne d'espace réservé pour guider un utilisateur pour démarrer une interaction de table dans une application. La raison en est que le nombre de lignes dans la section doit correspondre - comme le dit l'exception.

La façon de le gérer est simple appel que deleteRowsAtIndexPaths dans les cas où vous êtes changer le nombre de lignes dans la section. Donc, dans votre cas, vous dites que j'ai quatre lignes avec du contenu (probablement stocké dans un tableau ou une autre structure de données). Je supprime une de ces lignes mais je vais placer une rangée d'espace réservé à sa place. Le nombre de lignes dans la section à des fins d'affichage ne change donc pas. Ce que vous voulez faire alors est supprimer l'élément de votre structure de données de sorte que quand cellForRowAtIndex est appelé il chargera votre cellule d'espace réservé correctement mais vous n'avez pas réellement besoin d'essayer et de retirer la rangée de la vue de table.

Sinon, si vous voulez obtenir l'interaction de surbrillance, j'essaierais ce que Ian suggère en supprimant et en ajoutant les lignes dans une transaction - je n'ai pas testé cela dans cette situation cependant.

J'ai trouvé l'expérience de l'utilisateur assez fluide sans les animations supplémentaires, mais cela dépend de votre application.

2

Je pense que c'est prévu. Quand vous lui dites de supprimer une ligne, elle le prend littéralement - elle veut que cette ligne disparaisse. Il semble que vous vouliez simplement EFFACER la ligne, auquel cas j'appellerais reloadRowsAtIndexPaths: à la place, en m'assurant que votre source de données sait que cette ligne devrait maintenant être vide.

Ou - et cela pourrait être mieux - vous pouvez appeler un insertRowsAtIndexPath: juste après la suppression. Cela vous permettrait probablement d'animer un peu mieux les choses. Assurez-vous simplement de joindre les instructions delete et insert avec les instructions [tableView beginUpdates] et [tableView endUpdates].

Modifier: il suffit de relire la question. Peu importe ma première réponse, mais je pense que ma deuxième réponse devrait encore fonctionner.

Questions connexes