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 p> 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? P> P>
5 Réponses :
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];
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 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.
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 vérifier le guide Apple pour plus d'informations. P> utableviewcell code>). P>
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 Quelques conseils: P>
Ne jamais allouer des choses à l'intérieur d'un 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 Call au lieu d'ajouter le bouton via DEQUUEREUSABLECELDIdentifier code>), vous créerez un nouveau bouton i>, en ajoutant à la cellule (sur l'ancienne), etc. Le fait que Il est allé à travers
addssubview code> 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. P>
CellfrowrotinDExpath code> Sauf si c'est fait lorsque
DEQUUEREAREABLECELLWITHIdentifier code> 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 code> conditionnel juste après le code d'allocation de cellule. P> li>
code> code> sur le
indexpath.row code> 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. P> LI>
Libération code> sur le bouton Après avoir effectué un
addsubview code>. 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é. P> li>
addsubview code>, vous pouvez le renvoyer en tant que
accessoryview code> 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). p> li>
ul>
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.
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. P>
L'action du bouton est Déclenché par la Méthode de déléguée de la TableView TableView: DisSelectrowatidExpath: méthode. p>
Vous devriez ajouter [cellt.textLabel Setshadowcolor: [Uicolor BlackColor]]; [Cell.TextLabel SetShadowOffset: CGSIZEMAKE (0, -1)]; Code> au code. Cela donne au texte un effet légèrement gaufré afin qu'il ressemble plus à la touche natale.
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 / P>
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.