11
votes

Comment arrêter UitailView Cell Cells écrase le contenu?

J'utilise un UITableView et je remarque que les cellules de mon tableview deviennent progresively plus audacieux que je défiler, il est le contenu et permettent de remplacer je veux arrêter cela, mais ne peut pas voir où je vais mal.

sur mon UITableView, pour une raison quelconque quand je défiler le contenu de la tableview se foiré avec le l'UILabel créé manuellement. p>

Je besoin d'un UILabel manuel parce que je dois avoir des cellules personnalisées plus tard. p>

Comme je défiler vers le haut et vers le bas, les étiquettes deviennent progressivement plus audacieux et plus audacieux; ils ont toujours un chevauchement et parfois touche même des lignes plus bas (avant même qu'ils sont dans la fenêtre). p>

Si je continue à le faire, le contenu des cellules deviennent incompréhensibles dans. p>

Cela ne se produit si [: OUI cellLabel setClearsContextBeforeDrawing]; code> et [self.tableView setClearsContextBeforeDrawing il le p>

J'ai essayé backgroundColor est pas défini comme clearColor code>.: OUI];. code> sans effet p>

Si j'utilise cell.textLabel.text code> alors le problème semble aller p>

code et. un échantillon d'image suit p>

  // 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];
}


1 commentaires

7 Réponses :


17
votes
   if (cell == nil) { //cell initialization

6 commentaires

J'ai essayé de configurer les Uilabels sous la partie Cell == nil , tandis que cela arrête l'écrasement, il provoque un autre problème - il met des données dans des zones aléatoires dans la TableView. Mon code complet réel utilise un dictionnaire (Plist) et la cellule commence à mettre la même entrée dans des endroits aléatoires dans la table, je mettrai à jour ma question pour couvrir ce problème.


@zardon Les Uilabels étant ajoutés une fois ne sont pas effacés lorsque vous réutilisez la cellule avec DEQUUEREUSABLECELLWIDIdentifier , c'est votre responsabilité de mettre à jour le contenu de Sous-Views ou de réinitialiser son apparence de défaut (comme Settext: @ "" pour Uilabel) . Sinon, les sous-espions configurés précédemment seront éventuellement affichés sur des cellules réutilisées (au cas où vous modifiez le contenu de la cellule sous condition).


J'ai essayé de mettre à jour le contexte, mais je ne pense pas que son travail. Je vais essayer de rendre les Uilabels init à l'intérieur de la cellule == Nil et essayez d'y accéder par balise et voyez si cela aide. Je pourrais rechercher des tutoriels à ce sujet aussi que je n'ai jamais vu cette approche auparavant.


@zardon Vous pouvez en trouver un ici: kwigbo.com/post/3183498279/... < / a> (simple) ou ici: Cocoawithlove.com/2009/04 /asy-custom-ityviewView-Drawing.ht ml (plus complexe, et je l'aime beaucoup). Comme vous pouvez le deviner, une autre approche consiste à sous-classer le utableviewcell , mais qui rend le code différent, car vous ajoutez des sous-espions sur votre classe de cellules personnalisées, pas chez Cellfrowatindexpath Méthode de déléguée. Tutoriel: zCentric.com/2008/08/05/Custom-ittiableViewPell (Désolé, juste le premier formatage du code fantaisie, Google pour en trouver plus).


Merci A-Live. Le livre des recettes iOS semble également donner une vue d'ensemble de base - je vais utiliser vos idées et faire rapport. Cela pourrait être un moment, car j'ai besoin de tester quelques scénarios, mais si vous réussirez, je vais accepter et vérifier votre réponse. Merci


J'ai trouvé développeur.apple.com/Library / iOS / # Documentation / Userexperienc E / ... Pour être très utile! Cela donne un exemple plus large de ce que signifie un moyen de vivre. J'ai été capable de résoudre le problème des cellules écrasantes et j'ai ajouté ma solution, mais cette réponse a été acceptée.



0
votes

Essayez de ne pas mettre l'UIView * Cellview sur la cellule Uitabiliewcell *. L'UitaireViewCell est une sous-classe d'un UIView afin que vous puissiez ajouter des sous-espions si vous le souhaitez. Cependant, UitablesViewCell a déjà une étiquette à l'intérieur.

Il suffit d'utiliser [cell.textLabel Settext: txt] .


1 commentaires

Je ne peux pas utiliser TextLabel pour cette tâche car j'ai besoin de combiner un TextLabel, un gadget d'entrée ainsi que d'autres gadgets.



-1
votes

La réponse d'A-LIVE était la meilleure solution.

J'ai trouvé https://developer.apple.com/library/ios/#documentation/usereexperience/conceptual/tableview_iphone/tableviewcells/tableviewcells.html Pour donner un exemple beaucoup plus large.

Cependant, dans mes expériences, j'ai pu configurer UitablesViewCells qui n'ont pas écrasé et n'ont pas mis les valeurs de cellule dans des positions aléatoires.

Le code que j'ai utilisé est ci-dessous, il pouvait faire avec la fiabilité , mais il semble fonctionner pour le moment; xxx


0 commentaires

4
votes
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

           UITableViewCell *cell = (UITableViewCell*)[self.YourTableName dequeueReusableCellWithIdentifier:nil];        
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
        }


            return cell; 
        }
use ReusablecellIdentifier nil so it working correctly.....

1 commentaires

J'avais essayé Xcode 7 réutilisateur Nil ne fonctionne pas. Son montrent une question d'avertissement non argument de CellulesEED NULL.



6
votes

Vous ajoutez l'étiquette à chaque fois la même cellule réutilisée, c'est pourquoi il s'agit de plus au-dessus. Lorsque vous utilisez DEQUUEREUSEABLECELLELIVOIDIdentifier, vous saisissez une cellule qui a déjà été affichée à l'écran, qui est la bonne chose à faire, mais vous avez déjà mis une étiquette dessus. Comme l'étiquette sera dans la même position par rapport à la cellule à chaque fois, et la même couleur, etc. (le seul élément dynamique sera le texte), vous devez définir tout cela uniquement une fois.

Ma solution préférée consiste à créer une cellule personnalisée avec les propriétés souhaitées. Donc, dans ce cas, vous créeriez P>

cell.cellLabel.text = ....;


1 commentaires

Il dit: "Self" est immuable à Swift ??



4
votes

C'est un fil un peu plus vieux. Mais sera utile à quelqu'un,

Vous pouvez supprimer tout afficher code> ajouté à un Cell code> avant la même réutilisation dans le TableView code>.

Ce code fera cela, P>

cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.textLabel.font = nil;


0 commentaires

2
votes

Écrivez ce code pour COLLECTIONVIEW. Cela aidera à éliminer la duplicité de la cellule réutilisable.

- (void)viewDidLoad {
[super viewDidLoad];
arrImg=[[NSMutableArray alloc]initWithObjects:@"images.jpeg",@"images-2.jpeg",@"images-3.jpeg", nil];

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setItemSize:CGSizeMake(375, 200)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];

[self.colView setCollectionViewLayout:flowLayout];
self.colView.backgroundColor=[UIColor lightGrayColor];
self.colView.delegate=self;
self.colView.dataSource=self;

// Do any additional setup after loading the view, typically from a nib.
 }

  -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {


CollectionViewCell1 *cell=(CollectionViewCell1 *)[colView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell1" forIndexPath:indexPath];
float xAxis=0;
float maxwidth=0;


for (UIView* view in [cell.contentView subviews])
{
    if ([view isKindOfClass:[UIScrollView class]])  //Condition if that view belongs to any specific class
    {
        [view removeFromSuperview];
    }
}
if(indexPath.row==1)
{
    UIScrollView *scroll=[[UIScrollView alloc]initWithFrame:CGRectMake(0,0, colView.frame.size.width, 200)];

    scroll.delegate = self;
    [cell.contentView addSubview:scroll];

    for(int i=0;i<[arrImg count];i++)
    {

    UIImageView *img=[[UIImageView alloc]init];
    xAxis=xAxis+maxwidth;
    img.frame=CGRectMake(xAxis, 0, self.view.frame.size.width, 200);
    img.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@",[arrImg objectAtIndex:i]]];
        [scroll addSubview:img];
        maxwidth=self.view.frame.size.width;
    }

   scroll.contentSize=CGSizeMake(375*3, 200);
   scroll.pagingEnabled=YES;


}
   return cell;

}


0 commentaires