2009-05-19 11 views
2

J'ai un UITableView qui a un bouton de divulgation sur chaque ligne. Lorsque la table est mise en mode d'édition et que le contrôle de suppression est appuyé (signe "-"), le bouton Supprimer s'affiche, mais le bouton de divulgation n'est pas remplacé, mais glisse juste à gauche du bouton de suppression.IPhone UITableView supprimer le bouton de divulgation lorsque le bouton Supprimer est affiché

Le guide Apple UITableView explique les délégués pour tout ce qu'il semble sauf pour le délégué qui est appelé lorsque le signe "-" est appuyé, mais avant que le bouton de suppression ne soit affiché.

Je voudrais simplement supprimer l'indicateur de divulgation lorsque le bouton de suppression est affiché.

Je suppose qu'il me manque quelque chose ... J'ai mis le setHidesAccessoryWhenEditing:NO sur les cellules de la table de sorte que l'indicateur est affiché pour indiquer à l'utilisateur que s'ils sélectionnent la ligne, ils peuvent l'éditer ...

Le comportement que j'essaie de copier se fait dans l'application Contacts lorsqu'un contact est édité. Toute aide serait grandement appréciée ...

Merci, Greg

Répondre

4

La méthode standard consiste à utiliser cell.hidesAccessoryWhenEditing = YES et cette modification est une action modale dans laquelle la navigation est généralement désactivée.

L'application Contacts utilise en fait des cellules de tableau personnalisées, et je ne serais pas surpris si elle n'utilisait pas tellement un accessoire qu'une image située sur le bord droit de la cellule, à en juger par son comportement.

Si vous voulez savoir quand le bouton de suppression apparaît, je vous suggère que vous essayez d'installer un observateur valeur clé sur showingDeleteConfirmation propriété de la cellule, comme suit:

[cell addObserver: self forKeyPath: @"showingDeleteConfirmation" 
      options: NSKeyValueObservingOptionNew context: NULL]; 

Ensuite, vous implémentez le rappel d'observateur méthode:

- (void)observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object 
         change: (NSDictionary *) change context: (void *) context 
{ 
    if ([keyPath isEqualToString: @"showingDeleteConfirmation"]) 
    { 
     UITableViewCell * cell = (UITableViewCell *) object; 
     BOOL isShowing = [[change objectForKey: NSKeyValueChangeNewKey] boolValue]; 
     if (isShowing == NO) 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     else 
      cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
} 

Je dois souligner que je ne suis pas sûr que la classe UITableViewCell est KVO conforme pour cette propriété, mais il faut que ce soit la peine d'essayer ...

+0

Jim, Fonctionne comme un charme! J'apprécie vraiment que vous preniez le temps de répondre ... Merci, Greg –

+1

Au cas où quelqu'un arriverait à travers votre solution, juste pour être complet, ajoutez: UITableViewCell * cell = object; Modifier if (isShowing) -> if (! IsShowing) ... –

+1

Merci, j'ai mis à jour la réponse pour les inclure. Personnellement, j'aime utiliser '== NON' plutôt que d'utiliser! en face, sauf s'il existe un support spécifique du compilateur pour les types booléens (comme en C++). Le type BOOL de ObjC est juste un typedef (j'ai déjà été mordu par des choses de taille et des comparaisons avec des BOOL de taille char-char). –

1

L'indicateur de communication est géré par tableView:accessoryTypeForRowWithIndexPath: vous pourriez peut-être changer le type d'accessoire en mode d'édition.

Je crois qu'il ya un tableView:accessoryButtonTappedForRowWithIndexPath:, peut-être là vous pouvez noter que vous allez modifier le mode, puis changer ce que le tableView:accessoryTypeForRowWithIndexPath: renvoie pour chaque ligne - pas d'accessoire en mode édition.

Je voudrais essayer.

Voici une séquence d'appel (pas sûr si cela aide) Description/tutoriel/exemples de référence Apple sur la façon de faire Inserting and Deleting Rows in Editing Mode.

1

Mon commentaire à la solution de Jim n'a pas très bien été rencontré ... Voici la version qui a résolu le problème pour moi ... Merci encore Jim!

 
    - (void)observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object 
         change: (NSDictionary *) change context: (void *) context 
    { 
    UITableViewCell * cell = object; 
    if ([keyPath isEqualToString: @"showingDeleteConfirmation"]) 
    { 
     BOOL isShowing = [[change objectForKey: NSKeyValueChangeNewKey] boolValue]; 
     if (!isShowing) 
     { 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     } 
     else 
     { 

      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 
} 

2

Ou lorsque vous créez votre cellule, vous pouvez définir le type d'accessoire: cellule.editingAccessoryType = UITableViewCellAccessoryNone;

Questions connexes