2010-12-15 308 views
0

récemment j'ai découvert un bug vraiment gênant:cellules-contenu Chevauchement

le contenu de deux cellules (la première cellule de la table et la dernière cellule du tableau) sont mélangés dans une cellule (dans la première et la dernière cellule de la table). Cela se produit uniquement si j'ai 10 entrées dans ma table et que j'en ajoute une 11e (voir photo).

Avez-vous une idée de la façon dont un tel comportement peut se produire?

Cordialement, Sascha

http://i.stack.imgur.com/g9fkj.jpg

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

UITableViewCell *cell = nil; 

static NSString *kCellTextField_ID = @"CellTextField_ID"; 
cell = [tableView dequeueReusableCellWithIdentifier:kCellTextField_ID]; 
if (cell == nil) 
{ 
// a new cell needs to be created 
cell = [[[UITableViewCellGradient alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellTextField_ID] autorelease]; 

cell.backgroundColor = [UIColor clearColor]; 
cell.textLabel.backgroundColor = [UIColor clearColor]; 
cell.textLabel.textColor = [UIColor blackColor]; 

cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 
else 
{ 
// a cell is being recycled, remove the old edit field (if it contains one of our tagged edit fields) 
UIView *viewToCheck = nil; 
viewToCheck = [cell.contentView viewWithTag:1]; 
if (!viewToCheck) { 
    [viewToCheck removeFromSuperview]; 
} 
} 

NSUInteger row = [indexPath row]; 

if (indexPath.section == 0) { 

id objId = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 

if ([objId isKindOfClass:[UITextField class]]) { 
    UITextField *textField = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 
    [cell.contentView addSubview:textField]; 
} else if ([objId isKindOfClass:[UISegmentedControl class]]) { 
    UISegmentedControl *segmentedField = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 
    [cell.contentView addSubview:segmentedField]; 
} 
} 

if (row == 0) { 
[cell setPosition:UACellBackgroundViewPositionTop]; 
} else if (row == ([data count] - 1)) { 
[cell setPosition:UACellBackgroundViewPositionBottom]; 
} else { 
[cell setPosition:UACellBackgroundViewPositionMiddle]; 
} 



return cell;} 
+0

comportement non défini Ressemble causé par une mauvaise application de la UITableViewSourceDelegate de votre côté. (La mise en cache des cellules peut être assez compliquée) Pouvez-vous nous montrer du code? –

+0

Si vous pouvez publier le code, s'il vous plaît. J'ai eu quelque chose de similaire une fois et il s'est avéré que je l'ai mal fait dans la méthode cellForRowAtIndexPath. – hol

+0

Vous devriez mettre à jour votre question avec le code dans votre "réponse" et supprimer la "réponse". Quelle est la valeur du tag textField et segmentedField? Êtes-vous sûr qu'ils sont retirés lorsque la cellule est recyclée? – Anna

Répondre

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

UITableViewCell *cell = nil; 

static NSString *kCellTextField_ID = @"CellTextField_ID"; 
cell = [tableView dequeueReusableCellWithIdentifier:kCellTextField_ID]; 
if (cell == nil) 
{ 
    // a new cell needs to be created 
    cell = [[[UITableViewCellGradient alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellTextField_ID] autorelease]; 

    cell.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.textColor = [UIColor blackColor]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 
else 
{ 
    // a cell is being recycled, remove the old edit field (if it contains one of our tagged edit fields) 
    UIView *viewToCheck = nil; 
    viewToCheck = [cell.contentView viewWithTag:1]; 
    if (!viewToCheck) { 
     [viewToCheck removeFromSuperview]; 
    } 
} 

NSUInteger row = [indexPath row]; 

if (indexPath.section == 0) { 

    id objId = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 

    if ([objId isKindOfClass:[UITextField class]]) { 
     UITextField *textField = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 
     [cell.contentView addSubview:textField]; 
    } else if ([objId isKindOfClass:[UISegmentedControl class]]) { 
     UISegmentedControl *segmentedField = [[self.data objectAtIndex:row] valueForKey:kViewKey]; 
     [cell.contentView addSubview:segmentedField]; 
    } 
} 

if (row == 0) { 
    [cell setPosition:UACellBackgroundViewPositionTop]; 
} else if (row == ([data count] - 1)) { 
    [cell setPosition:UACellBackgroundViewPositionBottom]; 
} else { 
    [cell setPosition:UACellBackgroundViewPositionMiddle]; 
} 



return cell;}