append des buttons supplémentaires dans le balayage UITableView

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:

  • Apple l'a implémenté dans iOS8: pensez donc soigneusement à votre cible de deployment. Si vous codez uniquement pour i0S8, il s'agit d'une alternative simple et rapide aux bibliothèques tierces ou à la création d'un style d'édition UITableView personnalisé. Si vous souhaitez conserver la compatibilité pour iOS7, vos options sont limitées avec ce format. NOTE SIDE Cela ne provoque pas une erreur fatale dans votre code, les applications iOS7 ne planteront pas, cependant, les actions personnalisées ne s'afficheront tout simplement pas.
  • Il n'y a pas beaucoup de personnalisation au-delà du titre
  • Les avantages de ceci, c'est que tout est géré avec des blocs

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] }