Impossible d'afficher le button Supprimer sur tableviewcell ios 7

J'ai utilisé UITableviewcellEditingstyleDelete pour afficher le button pour que l'user clique dessus pour afficher le button de suppression (il en va de même pour l'application de messagerie, lorsque l'user clique sur Modifier puis sur le button pour afficher le button Supprimer). Il fonctionne très bien dans ios6 mais quand je construis mon application sur un appareil qui a ios 7, le button de suppression disparaît, mais lorsque vous appuyez sur la zone du button de suppression, il est également possible de supprimer. Le prolem est l'user ne peut pas voir le button de suppression (le button qui ont la couleur rouge fournir par OS). Mon code est:

 - (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { // Detemine if it's in editing mode if (self.editing) { return UITableViewCellEditingStyleDelete; } return UITableViewCellEditingStyleNone; } 

S'il vous plaît aidez-moi à find la solution, je ne connais pas beaucoup avec iOS7 environnement. Merci!

Merci à tous pour vos conseils, et cette solution peut le résoudre, je le fais en cellule personnalisée

  UIImageView* backgroundImage; //Variable for animation delete button // Keep the ContactView in normal state BOOL bFirstEditingCell; BOOL bShownRedMinus; BOOL bShownDeleteButton; CGRect frameOfContactViewInNormal; CGPoint centerOfCellInNormal; UITableViewCellAccessoryType accessoryTypeInNormal; 

//

  - (id)initWithCoder:(NSCoder *)decoder { if (self = [super initWithCoder:decoder]) { super.backgroundColor = [UIColor clearColor]; self.selectionStyle = UITableViewCellSelectionStyleNone; backgroundImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_gradient" ]]; self.backgroundView = backgroundImage; bShownDeleteButton = false; bShownRedMinus = false; bFirstEditingCell = true; accessoryTypeInNormal = UITableViewCellAccessoryNone; } return self; } - (void)willTransitionToState:(UITableViewCellStateMask)state { [super willTransitionToState:state]; if (!isOS7()) { return; } for (UIView *subview in self.subviews) { //Keep normal value of contact view and cell if (bFirstEditingCell ) { frameOfContactViewInNormal = self->contactView.frame; frameOfContactViewInNormal.size.width = kContactViewWidth; centerOfCellInNormal = subview.center; bFirstEditingCell = false; } if (state == UITableViewCellStateDefaultMask) { self.backgroundView = backgroundImage; subview.center = centerOfCellInNormal; //Set for position of speed dial image CGRect f = frameOfContactViewInNormal; if (bShownRedMinus) { f.size.width -= kRedMinusButtonWidth; } self->contactView.frame = f; bShownDeleteButton = false; self.accessoryType = accessoryTypeInNormal; } else if (state == UITableViewCellStateShowingDeleteConfirmationMask) { float sectionIndexWidth = 0.0; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { sectionIndexWidth = 30.0; } else { sectionIndexWidth = 15.0; } CGPoint center = centerOfCellInNormal; subview.center = CGPointMake(center.x - sectionIndexWidth, center.y); self.backgroundView = nil; //Set width of contact name UIView* view = [subview.subviews objectAtIndex: 0]; CGRect f = view.frame; f.origin.x = (kDeleteButtonWidth + sectionIndexWidth); view.frame = f; f = frameOfContactViewInNormal; f.size.width = self.frame.size.width - (kDeleteButtonWidth + sectionIndexWidth); self->contactView.frame = f; bShownDeleteButton = true; bShownRedMinus = false; accessoryTypeInNormal = self.accessoryType; self.accessoryType = UITableViewCellAccessoryNone; } else if (state == UITableViewCellStateShowingEditControlMask) { CGRect f = frameOfContactViewInNormal; f.size.width -= 5; self->contactView.frame = f; bShownRedMinus = true; } else if (state == 3) { //State for clicking red minus button CGRect f = frameOfContactViewInNormal; f.size.width += kRedMinusButtonWidth; self->contactView.frame = f; self.backgroundView = nil; } } } 

Il ressemble à l'un des bogues d' iOS 7 . Pour une raison quelconque, backgroundView est déplacé par iOS sur le button Supprimer. Vous pouvez contourner cela en sous-classant votre backgroundView et en implémentant la fonction setFrame de votre vue dérivée comme ceci:

Le button de suppression UITableViewCell est masqué.


Cela peut aussi arriver quand accesoryView est spécifié et que editingAccessoryView est nil . L'explication détaillée de ce problème et de la solution est mentionnée ici:

Le contenu UITableViewCell chevauche le button de suppression en mode d'édition dans iOS7.

Vous n'avez pas besoin de vérifier si la tableView est en cours d'édition … il suffit de mettre en œuvre:

 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; } 

La meilleure façon de supprimer ce problème est d'append une image dans la cellule et de la définir dans Backside.

  UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]]; imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height); [yourCustomCell addSubview:imageView]; [yourCustomCell sendSubviewToBack:imageView]; 

Si votre text chevauche le button Supprimer, implémentez Autolayout. Ça va mieux le gérer.

Un cas supplémentaire peut être généré que cellSelectionStyle mettrait en surbrillance avec la couleur par défaut. Vous pouvez définir la couleur de surbrillance comme suit

  yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone; Set your table cell's selection style to UITableViewCellSelectionStyleNone. This will remove the blue background highlighting or other. Then, to make the text label or contentview highlighting work the way you want, use this method in yourCustomCell.m class. - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if (highlighted) self.contentView.backgroundColor = [UIColor greenColor]; else self.contentView.backgroundColor = [UIColor clearColor]; } 

J'espère que cela vous aidera à comprendre.

Solution de contournement simplifiée

En supposant une application iOS7 seulement, avec une technique similaire à celle liée à la post par Vin ci-dessus, je crois que l'approche ici: https://stackoverflow.com/a/19416870/535054 va être plus propre.

Dans cette approche, vous n'avez pas besoin de sous-classr votre backgroundView, qui pourrait être différent pour différentes cellules.

Placez le code dans la réponse que j'ai liée ci-dessus, dans la racine de votre hiérarchie de cellule de tableau personnalisée, et toutes les cellules de votre tableau (qui en héritent), obtenez le correctif chaque fois qu'elles utilisent les propriétés backgroundView ou selectedBackgroundView.

Copiez la solution de cet article: https://gist.github.com/idStar/7018104

Un moyen facile de résoudre ce problème consiste à faire en sorte que l' delete confirmation button view de face. Cela peut être fait en implémentant la méthode déléguée layoutSubviews dans le file customtableviewcell.m .

Dans mon cas, je l'ai résolu en ajoutant simplement le code suivant dans le file customtableviewcell.m . Il peut être légèrement différent selon la façon dont les vues sont placées dans votre cellule. Mais sûrement, cela vous donnera une idée sur la façon de résoudre le problème.

 - (void)layoutSubviews // called when a interface orientation occur ie. in our case when the '-' button clicks { [super layoutSubviews]; for (UIView *subview in self.subviews) { // Loop through all the main views of cell // Check the view is DeleteConfirmationView or not, if yes bring it into the front if ([NSSsortingngFromClass([subview class]) isEqualToSsortingng:@"UITableViewCellDeleteConfirmationView"]) { [self bringSubviewToFront:subview];// code for bring the view into the front of all subviews } } }