UIButton in der Zelle UITableView wie "Delete Event"

8

Ich möchte eine Schaltfläche zu einer Tabellenzelle hinzufügen. Das "Delete Event" in der Kalender App hat mich inspiriert ... (ein ähnlicher Fall ist "Kontakt teilen" in Kontakten)

Ab sofort gibt es

%Vor%

was tatsächlich einen Knopf erzeugt. Es sieht noch nicht so aus wie es soll (es ist offensichtlich, dass ich noch nie mit Tasten im iPhone umgegangen bin), aber ist das zumindest der richtige Ansatz?

    
Marcel Stör 02.07.2009, 21:32
quelle

5 Antworten

19

Wie Sie es jetzt haben, jedes Mal, wenn eine Zelle angezeigt wird, ordnen Sie eine Schaltfläche zu, legen ihren Wert fest und fügen sie der contentView der Zelle hinzu. Wenn die Zelle wiederverwendet wird (über dequeueReusableCellWithIdentifier ), werden Sie einen weiteren neuen Button erstellen, der zur Zelle (über dem alten) hinzugefügt wird usw. Die Tatsache, dass sie durch% co_de gegangen ist %, aber keine explizite Freigabe bedeutet, dass die Anzahl der Retouren jeder Schaltfläche nie auf Null gehen wird, so dass sie alle bleiben. Nach einer Weile des Scrollens wird die Zelle mit hunderten von Button-Subviews enden, die wahrscheinlich nicht Ihren Vorstellungen entsprechen.

Ein paar Tipps:

  • Verteilen Sie niemals Zeug in einem addSubview -Aufruf, es sei denn, es ist fertig, wenn cellForRowAtIndexPath Null zurückgibt und Sie die Zelle initialisieren. Alle anderen nachfolgenden Zeiten werden Sie die zwischengespeicherte Zelle zurückgeben, die Sie bereits eingerichtet haben, so dass Sie nur die Beschriftungen oder Symbole ändern müssen. Sie werden alle diese Schaltflächenzuordnungselemente innerhalb der dequeueReusableCellWithIdentifier -Konditionalität direkt nach dem Zellenzuweisungscode verschieben wollen.

  • Die Schaltfläche muss eine Position und auch ein Ziel haben, damit sie etwas tut, wenn sie angetippt wird. Wenn jede Zelle diese Schaltfläche haben soll, ist es ein netter Trick, wenn sie alle auf dieselbe Zielmethode zeigen, aber den if -Wert der Schaltfläche auf den tag der Zelle setzen (außerhalb des Zellenzuweisungsblocks, da er für jeden variiert) Zelle). Der allgemeine Abgriffhandler für die Schaltfläche würde den Tag-Wert des Absenders verwenden, um die zugrunde liegenden Daten in der dataSource-Liste nachzuschlagen.

  • Rufen Sie indexPath.row auf der Schaltfläche auf, nachdem Sie eine release erstellt haben. Auf diese Weise fällt die Retain-Anzahl auf Null und das Objekt wird tatsächlich freigegeben, wenn das Parent freigegeben wird.

  • Anstatt die Schaltfläche über addSubview hinzuzufügen, können Sie sie als addSubview für die Zelle zurückgeben, sodass Sie sich keine Gedanken darüber machen müssen, sie zu positionieren (es sei denn, Sie verwenden die accessoryView bereits für etwas) sonst - wie Offenlegungstasten).

Ramin 02.07.2009 22:23
quelle
7

Ich habe einen anderen Ansatz gewählt, um ein Äquivalent zur Schaltfläche "Ereignis löschen" in der Kalender-App zu erstellen. Anstatt eine Schaltfläche als Unteransicht hinzuzufügen, habe ich den Zellen zwei Hintergrundansichten hinzugefügt (rot und dunkelrot, mit schönen Farbverläufen) und dann die Ecken gerundet und den Rahmen grau dargestellt.

Der Code unten erstellt eine wiederverwendbare Zelle (in der üblichen Weise). Die beiden Bilder, auf die Bezug genommen wird ('redUp.png' und 'redDown.png'), wurden einem Screenshot der Schaltfläche 'Ereignis löschen' des Kalenders entnommen. (Das schien schneller zu sein, als die Verläufe programmatisch zu erzeugen.) Es gibt Spielraum für ein bisschen mehr Feinabstimmung, um es noch näher an die "Delete Event" -Erscheinung des Kalenders zu bringen, aber das ist ziemlich nah.

Die Aktion der Schaltfläche wird durch die TableView-Delegate-Methode tableView ausgelöst: didSelectRowAtIndexPath: method.

%Vor%     
Obliquely 27.12.2010 13:36
quelle
1

Ja, das ist im Allgemeinen der richtige Ansatz.

Ein Tipp:

  • Legen Sie den Rückruf für Ihre Schaltflächenereignisse so fest, dass er beim Klicken tatsächlich ausgeführt wird.

    %Vor%

BEARBEITEN : Angepasster Code für die Verwendung einer Systemschaltfläche, die vieles von dem, was ich geschrieben habe, unnötig macht.

    
mmc 02.07.2009 21:41
quelle
1

Ja, Sie sind auf dem richtigen Weg, das ist der einfachste Weg, um einer Zelle eine Unteransicht hinzuzufügen (die andere Unterklasse einer UITableViewCell ).

Überprüfen Sie die Apple Guide für weitere Informationen.

    
Marco Mustapic 02.07.2009 21:48
quelle
0

Um Probleme bei der Positionierung und der Speicherverwaltung zu vermeiden, können Sie eine spezielle Zellklasse erstellen und eine Verknüpfung zu einem XIB herstellen. Das klingt nach der saubersten Herangehensweise an mich. Hier ist der Link: Ссылка

    
Jagan 20.01.2011 22:11
quelle

Tags und Links