web-dev-qa-db-fra.com

Modifiez la couleur du bouton de suppression de la couleur rouge par défaut dans UITableViewCell lorsque vous glissez des lignes ou cliquez sur le bouton Modifier

Je voulais changer la couleur du bouton moins et supprimer le bouton de UITableViewCell en cliquant sur le bouton modifier ou en balayant UITableView lignes. J'ai implémenté ce code jusqu'à présent:

-(IBAction)doEdit:(id)sender
{

    [[self keyWordsTable] setEditing:YES animated:NO];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

}
36
Hussain Shabbir

iOS 8 et 9 ( accessoires pour cet article )


Remarque: Si vous travaillez avec un projet iOS 7 existant, vous devrez mettre à jour la cible vers iOS 8 pour obtenir cette fonctionnalité. N'oubliez pas non plus de définir UITableviewDelegate.

Toute la magie opère maintenant ici (autant de boutons que vous le souhaitez aussi !!!!):

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

    return @[button, button2];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

}
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }


(iOS 7)


**activate the delete button on swipe**

// make sure you have the following methods in the uitableviewcontroller

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"You hit the delete button.");
    }

définir une étiquette de texte personnalisée au lieu de supprimer.

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"Your Label";
}

définir une couleur personnalisée pour le bouton partie 1 - avertissement, cela implique techniquement de fouiller dans l'API privée Apple. Cependant, vous n'êtes pas empêché de modifier une sous-vue à l'aide d'un recherche de méthode publique faisant partie de UIKIT.

Créez une classe uitableviewcell (voir aussi https://stackoverflow.com/a/22350817/1758337 )

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        //iterate through subviews until you find the right one...
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                //your color
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
            }
        }
    }    
}

Autre remarque: rien ne garantit que cette approche fonctionnera dans les futures mises à jour. Sachez également que mentionner ou utiliser la classe privée UITableViewCellDeleteConfirmationView peut entraîner le rejet de l'AppStore.

définir la couleur personnalisée pour la partie 2 du bouton

de retour dans votre uitableviewcontroller

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [YourTableView reloadData];
}

(La couleur alternative ne sera pas appelée jusqu'à ce que la prochaine fois que layoutSubviews soit appelé sur la tablette, nous nous assurons donc que cela se produit en rechargeant tout.)

97
timothykc

Exemple Swift (iOS 8)

ITableViewDelegate docs ( editActionsForRowAtIndexPath méthode)

Valeur de retour

Un tableau d'objets UITableViewRowAction représentant les actions de la ligne. Chaque action que vous fournissez est utilisée pour créer un bouton sur lequel l'utilisateur peut appuyer.

Discussion

Utilisez cette méthode lorsque vous souhaitez fournir des actions personnalisées pour l'une de vos lignes de tableau. Lorsque l'utilisateur glisse horizontalement sur une ligne, la vue tableau déplace le contenu de la ligne de côté pour révéler vos actions. Appuyer sur l'un des boutons d'action exécute le bloc de gestionnaire stocké avec l'objet action.

Si vous n'implémentez pas cette méthode, la vue du tableau affiche les boutons d'accessoires standard lorsque l'utilisateur balaie la ligne.

Exemple de travail dans Swift:

@available(iOS 8.0, *)
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let button1 = UITableViewRowAction(style: .Default, title: "Happy!") { action, indexPath in
        print("button1 pressed!")
    }
    button1.backgroundColor = UIColor.blueColor()
    let button2 = UITableViewRowAction(style: .Default, title: "Exuberant!") { action, indexPath in
        print("button2 pressed!")
    }
    button2.backgroundColor = UIColor.redColor()
    return [button1, button2]
}

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
}
23
clearlight

première fois que vous appelez willTransitionToState en .m (cellule personnalisée)

- (void)willTransitionToState:(UITableViewCellStateMask)state{
    NSLog(@"EventTableCell willTransitionToState");
    [super willTransitionToState:state];
    [self overrideConfirmationButtonColor];
}

Vérifiez la version iOS, c'est ici, j'utilise iOS 7 - iOS8

//at least iOS 8 code here
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
        // iOS 8+ code here
        for(UIView *subview in view.subviews) {

            if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
                return subview;

            UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
            if(recursiveResult)
                return recursiveResult;
        }
    }

    else{
        // Pre iOS 8 code here
        for(UIView *subview in view.subviews) {
            if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
            UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
            if(recursiveResult) return recursiveResult;
        }
    }
    return nil;


}

-(void)overrideConfirmationButtonColor
{

    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton)
        {
            UIColor *color = UIColorFromRGB(0xFF7373);
            confirmationButton.backgroundColor = color;

        }
    });
}
3
Giang

Impossible d'utiliser l'API publique.

Pour le bouton Supprimer, vous pouvez utiliser une implémentation personnalisée, telle que SWTableViewCell , pour modifier la couleur du bouton, ainsi que pour en ajouter d'autres.

2
Leo Natan

Ancienne question, mais je suis sûr que certaines personnes prennent en charge iOS 7. Pour modifier la couleur d'arrière-plan du bouton Supprimer, vous devez créer la classe "UITableViewCell" ou l'étendre. alors vous pouvez utiliser

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        for(UIView *childView in subview.subviews){
            if ([childView isKindOfClass:[UIButton class]]) {
                childView.backgroundColor = [UIColor blueColor];
            }
        }
    }
}
1
ofcourse_swift