Ich habe eine "Kontaktliste" -Tabellenansicht mit "Kontakt" -Zellen, die eine E-Mail-Schaltfläche enthalten, die, wenn sie angetippt wird, einen E-Mail-Composer mit der E-Mail-Adresse dieses Kontakts darstellen sollte.
Was ist der beste Weg, um das UIButton mit der "Kontakt" -Instanz dieser Zelle zu verbinden?
Ich habe Antworten für die beiden Ansätze geschaffen, die mir einfallen - die ich aber nicht wirklich befriedigend finde. Welche bevorzugen Sie, oder besser noch, schlagen Sie bessere vor!
Lassen Sie die Zellen die Aktion verarbeiten und rufen Sie eine benutzerdefinierte Delegate-Methode auf.
%Vor%Verstößt die Behandlung von Ereignissen in einer Ansicht nicht gegen das MVC-Prinzip?
Eine andere Lösung:
Für mich funktioniert so etwas einwandfrei und sieht sehr elegant aus:
%Vor%Update 12/01/2017
Nach einiger Zeit und der Implementierung vieler UITableViews muss ich zugeben, dass die beste Lösung das Delegationsmuster ist, das hier bereits von anderen vorgeschlagen wird.
Wenn ich diese Antworten lese, möchte ich meine Meinung sagen:
die oben genannte Lösung ist sicherlich die am schnellsten zu implementieren , aber es ist nicht das Beste aus der Sicht des Design / Architektur . Außerdem erhalten Sie die indexPath
, müssen aber eine andere Information berechnen. Das ist eine coole Methode, würde aber nicht das Beste sagen.
Holen Sie sich die Zelle auf diese Weise ist teurer von den vorherigen und es ist nicht so elegant.
Absolut nicht. Verwenden Sie die Tag-Dose scheint eine coole Lösung, aber das -Tag eines Steuerelements kann für eine Menge Dinge verwendet werden , wie der nächste Responder usw. Ich mag es nicht und das ist nicht die richtiger Weg .
Dies ist die Lösung . Verwenden Sie delegation
oder verwenden Sie blocks
ist wirklich eine nette Sache zu tun, weil Sie alle Parameter übergeben können, die Sie möchten und die Architektur skalierbar machen . Tatsächlich könnten Sie in der delegate
-Methode (aber auch mit blocks
) direkt Informationen senden wollen, ohne sie später berechnen zu müssen, wie die vorherigen Lösungen.
Viel Spaß;)
Ich denke, ich habe einen neuen Ansatz gefunden, der ein bisschen schlau ist. Sag mir, was du darüber denkst.
Sie können auch Daten innerhalb dieses Anrufs übergeben. Wie die Zelle oder etwas, das in der Zelle gespeichert ist.
Grüße, Alex
Bestimmen Sie die Zelle und damit den Indexpfad, indem Sie die Ansichtshierarchie der Zelle über die Schaltfläche durchlaufen.
%Vor%Es fühlt sich klobig an. Irgendwie "mah" ...
Ich würde einen anderen Ansatz anbieten, einfach das aktive Ziel nicht zuweisen, das Ereignis wird die Antwortkette durchlaufen:
%Vor%und dann, in Ihrer Ansicht Controller:
%Vor%Dies erzeugt jedoch eine Compiler-Warnung, die hinzugefügt wird, um sie zu ignorieren:
%Vor%Tags und Links uitableview ios uicollectionview uikit