C'est en fait assez facile.
Il suffit de créer une nouvelle sous-classe de UIControl et tout mettre dedans (pas besoin d'un contrôleur séparé.) Appelons ça de la ToggleImageControl.
@interface ToggleImageControl : UIControl
{
BOOL selected;
UIImageView *imageView;
UIImage *normalImage;
UIImage *selectedImage;
}
Créer un ToggleImageControl pour chaque cellule, et l'ajouter à la position appropriée.
ToggleImageControl *toggleControl = [[ToggleImageControl alloc] initWithFrame: <frame>];
toggleControl.tag = indexPath.row; // for reference in notifications.
[cell.contentView addSubview: toggleControl];
Ajouter une UIImageView pour contenir l'image. Ajouter une cible pour l'événement tactile.
- (void) viewDidLoad
{
normalImage = [UIImage imageNamed: @"normal.png"];
selectedImage = [UIImage imageNamed: @"selected.png"];
imageView = [[UIImageView alloc] initWithImage: normalImage];
// set imageView frame
[self.view addSubview: imageView];
[self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchUpInside];
}
Définir la UIImageView l'image de la propriété pour mettre à jour l'image, qui va déclencher le redessiner sans effets secondaires.
- (void) toggleImage
{
selected = !selected;
imageView.image = (selected ? selectedImage : normalImage);
// Use NSNotification or other method to notify data model about state change.
// Notification example:
NSDictionary *dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: self.tag forKey: @"CellCheckToggled"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"CellCheckToggled" object: self userInfo: dict];
}
Il vous faudra bien évidemment pour masser certaines choses. Vous voulez probablement passer dans les deux noms d'images pour le rendre plus réutilisable, et aussi j'avais recommandons de spécifier le nom de notification de la chaîne de l'extérieur de l'objet (en supposant que vous êtes à l'aide de la méthode de notification.)