Uiswitch dans un accessoire personnalisé
-
12-11-2019 - |
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
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;
}