8
votes

Uibutton dans UitailView Cell comme "Evénement de suppression"

Je voudrais ajouter un bouton à une cellule de table. Le "Evénement de Supprimer" dans l'application Calendrier m'a inspiré ... (un cas similaire est "Partager le contact" dans les contacts)

à partir de maintenant, il y a xxx

qui produit un bouton, en effet. Cela n'a pas encore l'air de savoir comment il est supposé (il est évident que je n'ai jamais traité des boutons dans iPhone, mais est-ce au moins la bonne approche?


3 commentaires

L'action résultante du bouton sera-t-elle différente selon laquelle la rangée est-elle? (E.G. Envoyez le contact actuel dans cette rangée, etc ...)


Si tel est le cas, vous pouvez définir la balise du bouton de chaque cellule pour dire, la ligne IndexPath, puis lisez la balise de l'expéditeur dans le sélecteur qui est exécuté sur une touche.


Eh bien, comme avec "Supprimer l'événement", je n'aurai qu'un seul bouton au bas de l'interface utilisateur I.E. Dans la dernière ligne.


5 Réponses :


1
votes

Oui, c'est généralement la bonne approche.

Un conseil: p>

  • Définissez le rappel pour vos événements de bouton, de sorte qu'il fait quelque chose lorsque vous avez cliqué sur. p>

    [myButton addTarget:self action:@selector(whatMyButtonShouldDo:)   
      forControlEvents:UIControlEventTouchUpInside];
    


4 commentaires

Dans son code d'exemple, il n'est pas nécessaire de libérer le bouton, car [Bouton UIBTONTONWITHITTYPE:] Retourne une instance AutoReleed.


Vous êtes exactement correct, j'ai copié que du code i a eu lieu où j'ai utilisé mon initwithframe. Ajustement.


Merci pour les commentaires. L'indice avec libération / autorelease a été noté. Est-il vraiment nécessaire de violer le cadre? Je veux simplement que le bouton remplisse la cellule de la table entière (je ne vous inquiétez pas de la position et de la taille); "Supprimer l'événement" démontre cela bien.


Ouais, j'ai fait des choses trop compliquées en copiant mon code, où je n'utilise pas les boutons système, je définit le cadre et les images d'arrière-plan à la main. J'ai abrégé ma réponse considérablement.



1
votes

Oui, vous êtes sur la bonne voie, c'est le moyen le plus simple d'ajouter une sous-affichée à une cellule (l'autre est la sous-classement A utableviewcell ).

vérifier le guide Apple pour plus d'informations.


0 commentaires

19
votes

La manière dont vous l'avez maintenant à chaque fois qu'une cellule est affichée, vous attribuez une touche, définissant sa valeur et l'ajout au contenu de la cellule. Lorsque la cellule est réutilisée (via DEQUUEREUSABLECELDIdentifier ), vous créerez un nouveau bouton , en ajoutant à la cellule (sur l'ancienne), etc. Le fait que Il est allé à travers addssubview mais aucune libération explicite signifie que la retenue de la conserve de chaque bouton n'ira jamais à zéro, donc ils vont tous coller. Après un certain temps de défilement de haut en bas, la cellule se retrouvera avec des centaines de sous-visions de boutons qui ne sont probablement pas ce que vous voulez.

Quelques conseils:

  • Ne jamais allouer des choses à l'intérieur d'un CellfrowrotinDExpath Sauf si c'est fait lorsque DEQUUEREAREABLECELLWITHIdentifier est renvoyé nil et que vous initialisez la cellule. Tous les autres moments suivants que vous serez remis de la cellule mise en cache que vous aurez déjà configuré pour que tout ce que vous avez à faire est de changer les étiquettes ou les icônes. Vous allez vouloir déplacer tout ce bouton d'allocation de bouton dans le si conditionnel juste après le code d'allocation de cellule.

  • Le bouton doit avoir une position et un ensemble cible pour celui-ci afin qu'il fera quelque chose lors de la prise en charge. Si chaque cellule va avoir ce bouton une astuce soignée consiste à les avoir tous de point à la même méthode cible, mais définissez la valeur sur le indexpath.row de la cellule (en dehors du bloc d'allocation de cellules car il varie pour chaque cellule). Le gestionnaire de robinet commun pour le bouton utiliserait la valeur de l'étiquette de l'expéditeur pour rechercher les données sous-jacentes de la liste de données de données.

  • Call Libération sur le bouton Après avoir effectué un addsubview . De cette façon, le nombre de retenons tombera à zéro et l'objet sera réellement libéré lorsque le parent est libéré. ​​

  • au lieu d'ajouter le bouton via addsubview , vous pouvez le renvoyer en tant que accessoryview pour la cellule afin de ne pas avoir à vous soucier de la positionner ( Sauf si vous utilisez déjà l'accessoireview pour quelque chose d'autre - comme des boutons de divulgation).


2 commentaires

Merci un tas pour les précieuses indices et explications. Une programmation d'iPhone Newbie comme moi l'apprécie certainement. Comme pour TIP 4, comme avec "Supprimer l'événement" / "Partager contact", je n'aurai qu'un seul bouton au bas de l'interface utilisateur I.E. Dans la dernière ligne. Donc, il ne peut pas être l'accessoire, mais il doit remplir la ligne entière. Je me débats toujours avec ça.


En ce qui concerne # 3, le relâchement du bouton plantera votre application. Il ne l'attribue pas.



7
votes

J'ai adopté une approche différente pour créer un équivalent au bouton "Supprimer l'événement" de l'application Calendrier. Plutôt que d'ajouter un bouton sous forme de sous-visView, j'ai ajouté deux vues de fond (rouge rouges et plus sombres, avec de jolies gradients) aux cellules puis arrondi les coins et réglaient la bordure en gris.

Le code ci-dessous crée une ré- cellule utilisable (à la mode habituelle). Les deux images mentionnées ("redup.png 'et" reddown.png ") ont été extraites à partir d'une capture d'écran du bouton" Supprimer "du calendrier. (Cela semblait plus rapide que de créer les gradients de manière programmatique.) Il y a une portée pour un peu plus de réglage fin pour que cela soit encore plus proche de l'apparence "Supprimer" de l'événement "du calendrier, mais c'est assez proche.

L'action du bouton est Déclenché par la Méthode de déléguée de la TableView TableView: DisSelectrowatidExpath: méthode. xxx


1 commentaires

Vous devriez ajouter [cellt.textLabel Setshadowcolor: [Uicolor BlackColor]]; [Cell.TextLabel SetShadowOffset: CGSIZEMAKE (0, -1)]; au code. Cela donne au texte un effet légèrement gaufré afin qu'il ressemble plus à la touche natale.



0
votes

Pour éviter les tracas de positionnement et de gestion de la mémoire Vous pouvez créer une classe de cellules spécialisée et créer un lien vers une XIB. Cela ressemble à l'approche la plus propre pour moi. Voici le lien: http://icodeblog.com/2009/05/24/ Custom-UitailViewCell-utiliser-interface-Builder /


0 commentaires