Objectif C UITableView - les cellules d'un Tableau d'affichage mal de contenu après la modification de la cellule de hauteur
Je suis en train de construire une application dans xcode, qui -à côté des autres - lit un flux rss et affiche les messages. Je suis nouveau avec objective-c et de trouver un peu dur parfois.
- Je utiliser un NSMutableArray pour le récupéré les articles(posts). Chaque histoire est représenté par un NSMutableDictionary qui contient le titre, le sujet, la date et le lien du post. Tous ces sont affichés dans une UITableView dans un UIViewController.
J'ai personnalisé ma propre cellule, afin que je puisse afficher plusieurs étiquettes.
Mon problème est que si j'utilise tableView:heightForRowAtIndexPath:, les 5 premiers (cellules adapter à l'écran) affichage ok, mais si vous faites défiler vers le bas, à côté des cellules semblent avoir le même contenu avec les 5 premiers(c'est-à cellules 0-4 affichage ok, cellule 5 a contenu de la cellule 0, la cellule 6 de la cellule 1, etc)! Si je retire la tableView:heightForRowAtIndexPath: tout est très bien (sauf de ne pas avoir la taille de la cellule je veux)
Voici comment le code est:
// NavigationContentsViewController.h
@interface NavigationContentsViewController :
UIViewController <UITableViewDelegate, UITableViewDataSource> {
UITableView *myTableView;
IBOutlet UITableView * newsTable;
UIActivityIndicatorView * activityIndicator;
CGSize cellSize;
NSXMLParser * rssParser;
NSMutableArray * stories;
NSMutableDictionary * item; //it parses through the document, from top to bottom...
NSString * currentElement;
NSMutableString * currentTitle, * currentDate, * currentSummary, * currentLink;
}
@property(nonatomic,retain)NSMutableArray *itemsList;
@property(nonatomic,retain)UITableView *myTableView;
- (void)parseXMLFileAtURL: (NSString *)URL;
.
//NavigationContentsViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//Configure the cell.
static NSString *MyIdentifier = @"MyIdentifier";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil){
cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
//Set up the cell
int storyIndex = indexPath.row;
//[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];
//Story title
//cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
//cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];
cell.lDate.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
return cell;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *selectedCellItem = [NSString stringWithFormat:@"%d", indexPath.row];
TableViewController *fvController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:[NSBundle mainBundle]];
fvController.selectedCellItem = selectedCellItem;
[self.navigationController pushViewController:fvController animated:YES];
[fvController release];
fvController = nil;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 80;
}
Des indices? [EDIT: changé int storyIndex = indexPath.ligne;]
int storyIndex = [indexPath indexAtPosition:[indexPath length] - 1];
au lieu de int storyIndex = indexPath.row;
?Si il y a des parties en cause, il ne obtenir un peu compliqué...dans ce cas, je vous recommande de créer plusieurs NSMutableArrays pour chaque section (mais encore une fois, vous aurez probablement à créer un plus grand éventail de les conserver, ou si elle devient trop grande, vous aurez à commencer à charger à partir du disque directement).
Tout d'abord merci pour les embêter avec mes question! Comme à l'écrit, c'est la première fois que j'ai à composer avec l'obj-c, donc il ya beaucoup de fois j'ai pu utiliser de mauvaises choses, ou de faire des choses avec une étrange manière. Il suffit de lire votre félicite, et je me sentais ridicule... de toute façon, cela ne changera rien à ma question 🙂
Je n'ai jamais utilisé indexAtPosition, et je ne suis pas sûr de quoi il en retourne, mais je suis assez certain que c'est le retour à l'index d'une cellule qui est actuellement sur les écrans, ce qui est la cause de vos problèmes. Si vous n'avez pas d'articles dans votre vue de la table, alors il suffit d'utiliser indexPath.ligne.
Je suis un peu confus. Comment est-ce que plusieurs NSMutableArrays résoudre le problème? En fait, il ne sera pas à le résoudre, je vais juste changer la manière de faire les choses. Pourquoi changer de cellule, la hauteur d'avoir à faire avec le contenu de la cellule? Ou heightForRowAtIndexPath n'a pas à le faire uniquement avec de la cellule de la hauteur? (En passant merci pour la réponse aussi)
OriginalL'auteur CdB | 2011-02-22
Vous devez vous connecter pour publier un commentaire.
C'est le problème habituel des gens avec cellule de la table de la réutilisation.
cette ligne tente de réutiliser une cellule. cela signifie que si la cellule 0 se déplace hors de l'écran, elle sera réutilisée en tant que cellule 5:
si une cellule n'a pas pu être réutilisés vous créez un nouveau:
et sur la ligne suivante est votre problème, vous pouvez configurer la cellule que si une cellule ne pouvaient pas être réutilisés. Ce qui arrive 5 fois (pour les cellules qui sont visibles lorsque la table n'est plus visible).
Mais toutes les cellules de votre tableau veut afficher la suite sera réutilisé les cellules qui ont déjà du contenu.
mais ne vous inquiétez pas. c'est très facile à corriger. Vous devez séparer la création de votre cellule à partir de sa configuration. Passez un peu de code comme ça:
EDIT: je devrais peut-être lire la question la prochaine fois. Mais je suppose que je suis toujours à 100%.
Je pense que c'est une coïncidence. Combien de cellules avez-vous? Je suppose que autour de 7 ou 8? Tout est très bien parce que toutes vos cellules sont visibles en même temps. Donc, il n'est pas nécessaire de réutiliser une cellule, et ils ont tous le contenu de ce qu'ils devraient avoir.
OriginalL'auteur Matthias Bauch
À l'aide de [indexPath indexAtPosition...] est le plus probable que votre source d'erreur—il n'est pas plus votre propre chemin d'index.
Toutefois, si vous créez un CustomCell (espérons-le dans de l'IB?) ensuite, vous devez définir la taille de la cellule de l'IB, et de ne pas faire dans le code.
Faire un NSLog sur indexPath.rangée...il devrait fonctionner parfaitement.
Avez-vous créer le CustomCell par sous-classement UITableViewCell et d'ajouter des étiquettes avec des méthodes comme initWithFrame:? Dans ce cas, définissez la taille de la cellule dans CustomCell.m, car il n'est pas en train de changer.
Définir son cadre dans de l'init par défaut, ou vous pouvez utiliser un initWithFrame. Apple, la documentation officielle est réellement utile ici; faites défiler jusqu'à environ un tiers du chemin vers le bas où il est dit "Personnalisation des Cellules": developer.apple.com/library/ios/#documentation/UserExperience/... Aussi, voir ce tutoriel pour l'ajout de cellules de l'IB: iphone.galloway.moi.royaume-uni/iphone-sdktutorials/...
Vous êtes les bienvenus! Désolé, je n'ai pas compris la question de l'heure—j'ai trop l'habitude de code de modèle à avoir réalisé qu'en effet, vous êtes juste un avait un corset trop loin...
OriginalL'auteur FeifanZ