Actuellement, j'utilise NSFetchedResultsController pour gérer les vues de table. Je me request est-il possible d'append des buttons supplémentaires comme le button Supprimer en mode balayage?
Je pense à le sous-classr. Mais ne trouve rien de pertinent dans les documents d'aide à mes problèmes.
Merci d'avance.
Votre titre est trompeur. NSFetchedResultsController n'a aucune pertinence pour votre objective final. Sous-classr créerait simplement plus de travail que nécessaire, ce que vous voulez regarder est UITableViewRowAction
. Cela se manipule très facilement et de manière similaire au nouveau UIAlertController
, vous devriez donc vous sentir très à l'aise si vous avez déjà UIAlertController
le UIAlertController
Un bref synopsis (directement à partir des documents ) de UITableViewRowAction
:
Demande au délégué d'afficher les actions en réponse à un balayage dans la ligne spécifiée. (requirejs) Utilisez cette méthode lorsque vous souhaitez fournir des actions personnalisées pour l'une de vos lignes de table. Lorsque l'user balaie horizontalement dans une rangée, la vue de la table déplace le contenu de la ligne de côté pour révéler vos actions. Appuyez sur l'un des buttons d'action pour exécuter le bloc gestionnaire stocké avec l'object action. Si vous n'implémentez pas cette méthode, la vue de table affiche les buttons d'accessoire standard lorsque l'user passe la ligne.
Quelques notes avant de commencer:
Néanless, pour implémenter une UITableViewRowAction
personnalisée, vous devez d'abord vous assurer que votre table est modifiable en appelant les methods suivantes:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { //Obviously, if this returns no, the edit option won't even populate return YES; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { //Nothing gets called here if you invoke `tableView:editActionsForRowAtIndexPath:` according to Apple docs so just leave this method blank }
Au minimum, ce sont les deux methods qui doivent être déclarées avant de passer à autre chose.
Pour personnaliser réellement vos buttons d'action de ligne, suivez les instructions générales comme suit:
ÉTAPE 1 implémentez la tableView:editActionsForRowAtIndexPath:
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { }
Comme vous pouvez le voir, il s'agit d'une méthode d'instance de type NSArray, vous devez donc returnner un tableau.
ÉTAPE 2 Ajoutez des objects d'action à transmettre dans le tableau. Un exemple:
{ UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { // Delete something here }]; UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { //Do whatever here : just as an example : [self presentUIAlertControllerActionSheet]; }]; }
Vous pouvez modifier quelques propriétés pour ces actions de ligne, mais consultez les documents pour les options de personnalisation complètes:
Pour personnaliser les colors d'arrière-plan de l'action de ligne , il suffit de la préformer comme la plupart des autres actions dans les buttons:
delete.backgroundColor = [UIColor redColor]; more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; //arbitrary color
ÉTAPE 3 Comme mentionné précédemment, vous devez returnner un tableau dans la méthode de l'instance afin que votre code complet ressemble à ce qui suit:
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { // Delete something here }]; delete.backgroundColor = [UIColor redColor]; UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { //Just as an example : [self presentUIAlertControllerActionSheet]; }]; more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; return @[delete, more]; //array with all the buttons you want. 1,2,3, etc... }
Pour reference ultérieure: LIEN VERS LA DOCUMENTATION
EDITED POUR LA SYNTAXE SWIFT
override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { var delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in //Do something }) delete.backgroundColor = UIColor.redColor() var more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in //Do something }) more.backgroundColor = UIColor.blueColor() return [delete, more] }
Tous les félicitations à @soulshined réponse acceptée.
Voici la version 3 de Swift:
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let delete = UITableViewRowAction(style: .default, title: "Delete") { (action:UITableViewRowAction, indexPath:IndexPath) in print("delete at:\(indexPath)") } delete.backgroundColor = .red let more = UITableViewRowAction(style: .default, title: "More") { (action:UITableViewRowAction, indexPath:IndexPath) in print("more at:\(indexPath)") } more.backgroundColor = .orange return [delete, more] }