Question


J'ai mon UITableViewCell sous-classe dans laquelle j'utilise un UISwitch comme accessoryView de cette façon:
mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
self.accessoryView = mySwitch;
Et tout va bien! L'application fonctionne bien.

Maintenant j'ai besoin d'en ajouter UIImageView Au-dessus du commutateur, alors j'ai pensé "Eh bien, faisons un accessoire personnalisé!":
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 10.0f, 100.0f, 60.0f)];
...
mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0.0f, 22.0f, 94.0f, 27.0f)];
[myView addSubview:mySwitch];
self.accessoryView = myView;
[myView release];

Tout semble être OK, mais il y a un comportement étrange. Lorsque j'ouvre un autre ViewController et je reviens à la table, les commutateurs sont mystérieusement changés ...
Ce n'est pas un problème dans la gestion des données, mais seulement dans la cellule redessiant ... s'il vous plaît, aidez-moi, que puis-je faire?

Merci d'avance

Était-ce utile?

La solution 2

EMH ... J'ai trouvé le problème ... il n'était pas lié à la table de table ...
Sur UIControlEventValueChanged Le sélecteur récupère la valeur de commutateur et la cellule indexPath.row de cette façon:
UISwitch *tempSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];

puis il met à jour l'objet correspondant (d'une classe de logique de données) enregistrée dans un NSMutableArray (la source de données de la table de table)

Mais maintenant, le commutateur n'est pas le AccessoryView, mais une sous-vue de l'accessoire, donc l'objet est des mises à jour de manière imprévisible. J'ai résolu avec une seconde superview message.

Désolé pour mon erreur et merci à tous ...

Autres conseils

Cela se produit parce que les cellules sont réutilisées. Donc, si vous avez ajouté SubView à la vue de contenu de la cellule, puis une fois que cette cellule est réutilisée dans une autre ligne, cette vue apparaîtra dans cette ligne. La meilleure façon d'éviter cela est de maintenir NSArray dans l'ourlet de données de votre table (c'est généralement votre contrôleur de vue) qui contient toutes les vues personnalisées (avec des sous-vues). Ensuite, vous pouvez faire comme ceci:

-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath {
    NSInteger row = indexPath.row;
    static NSString* cellIdentifier = @"Trololo";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
    if( !cell ) {       
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier: cellIdentifier] autorelease];
    }

    [[cell.contentView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
    [cell.contentView addSubview: [_your_cell_views objectAtIndex: row]];

    return cell;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top