Comment arrêter la cellule UITableView est en train d'écraser le contenu?
Je suis à l'aide d'un UITableView et je m'aperçois que les cellules de mon tableview sont arriver progresively plus audacieuses comme je l'ai défiler, il est d'écraser le contenu et je veux arrêter de ce mais ne peut pas voir où je vais mal.
Sur mon UITableView, pour quelque raison que quand j'ai faites défiler le contenu de la tableview obtenir foiré avec l'créés manuellement UILabel.
J'ai besoin d'un manuel UILabel parce que j'ai besoin pour des cellules plus tard.
Que j'ai faites défiler vers le haut et vers le bas, les étiquettes deviennent progressivement de plus en plus audacieux; ils se chevauchent toujours et parfois même affecte des lignes plus bas (avant même qu'ils sont dans la fenêtre d'affichage).
Si je continue à le faire, le contenu de la cellule devenir unintelligable.
Cela se produit uniquement si le backgroundColor n'est pas définie comme clearColor
.
J'ai tenté [cellLabel setClearsContextBeforeDrawing:YES];
et [self.tableView setClearsContextBeforeDrawing:YES];
pas d'effet.
Si j'utilise cell.textLabel.text
alors le problème semble disparaître.
Code et une image de l'échantillon suit.
//Simple table view
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
//Configure the cell...
//[self configureCell:cell atIndexPath:indexPath];
NSString *txt = @"Product";
//cell.textLabel.text = txt;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *cellView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, cell.frame.size.height)];
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[cellLabel setText:txt];
[cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[cellLabel setBackgroundColor:[UIColor clearColor]];
[cellView addSubview:cellLabel];
[cellLabel release];
[cell.contentView addSubview:cellView];
[cellView release];
return cell;
}
Image follows;
![image of uitableview][1]
[1]: http://i.stack.imgur.com/5lNy6.png
//Edit to include context
I am using a dictionary to display the contents of the UITableViewCells.
I have attempted to do the following;
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
[self configureCell:cell atIndexPath:indexPath];
} //end if
//Configure the cell...
//
//Moved to inside the cell==nil
return cell;
}
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
//Get the txt from the Dictionary/Plist... *removed due verboseness*
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[cellLabel setText:txt];
[cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[cellLabel setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:cellLabel];
[cellLabel release];
}
Ce, même si elle résout le problème de l'écrasement -- il provoque un problème: il permet d'imprimer des étiquettes à plusieurs reprises apparaissent dans des endroits aléatoires -- ce qui suit est juste un exemple, d'autres champs et des étiquettes aussi de répéter.
Voir image ci-dessous;
source d'informationauteur zardon
Vous devez vous connecter pour publier un commentaire.
retour, la cellule déjà été utilisé, il a déjà un UILabel sous-vue et que vous ajoutez une autre sur elle. Mettre l'ajout de sous-vues à la section
et de modifier les sous-vues comme nécessaires après la cellule d'initialisation, vous pouvez y accéder par tag, par exemple.
Vous êtes l'ajout de l'étiquette à la même réutilisé cellule à chaque fois, c'est pourquoi il devient de plus en plus audacieux. Lorsque vous utilisez dequeueReusableCellWithIdentifier, vous récupérez une cellule qui a déjà été affiché sur l'écran, ce qui est la bonne chose à faire, mais vous avez déjà mis une étiquette sur elle. Comme l'étiquette sera dans la même position par rapport à la cellule, à chaque fois, et de la même couleur etc.. (le seul élément dynamique sera le texte), vous devez régler tout cela qu'une seule fois.
Ma solution préférée est de créer une cellule personnalisé avec les propriétés que vous souhaitez. Donc, dans ce cas, vous devez créer
Lui donner une propriété UILabel *cellLabel, et faire tout le code que vous avez ci-dessus en plus d'établir les étiquettes de texte dans l'init de MyCustomCell.m, remplacez toutes les occurrences de la cellule avec soi-même, par exemple:
Maintenant dans votre cellForRowAtIndexPath utilisation MyCustomCell, où vous vérifier si la cellule == nil, vous pouvez également vérifier l'étiquette de la cellule:
De réagir exactement de la même manière:
maintenant, tout ce que vous devez faire est de définir:
votre code dans cellForRowAtIndexPath est beaucoup plus propre, de la mémoire et efficace et vous n'obtiendrez pas votre bug.
N'oubliez pas de régler votre téléphone pour être de type MyCustomCell dans interface builder.
utilisation ReusablecellIdentifier de néant, de sorte qu'il fonctionne correctement.....
C'est un peu plus vieux thread. Mais sera utile à quelqu'un,
Vous pouvez supprimer n'importe quel
view
ajouté à uncell
avant même d'être réutilisées dans letableView
.Ce code va le faire,
Ce peut être ajoutée avant la configuration de la cellule,
Vous pouvez également faire de la cellule étiquette de valeurs à zéro pour éviter la répétition de fuite cellules.
Écrire ce code pour collectionView. Il vous aidera à supprimer de la duplicité de réutilisables cellule.
Essayez de ne pas mettre la UIView *cellView sur le UITableViewCell *cellule. Le UITableViewCell est une sous-classe d'une UIView de sorte que vous pouvez ajouter des sous-vues si vous le souhaitez. Cependant UITableViewCell a déjà une étiquette à l'intérieur.
Suffit d'utiliser
[cell.textLabel setText:txt]
.Un-Live réponse était la meilleure solution.
J'ai trouvé https://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html pour donner une beaucoup plus large exemple.
Cependant, dans mes expériences, j'ai été capable de mettre en place UITableViewCells qui n'écrase pas, et n'a pas mis les valeurs des cellules dans des positions aléatoires.
Le code que j'ai utilisé est en dessous, il pourrait le faire avec tiyding, mais il semble fonctionner pour l'instant;