Ich versuche, einen zusätzlichen Parameter an die Aktion buttonClicked zu übergeben, kann jedoch nicht herausfinden, wie die Syntax in Swift lauten soll.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Jede meiner buttonClicked-Methoden:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Hat jemand irgendwelche Ideen?
Danke für Ihre Hilfe.
WARNING TO INTERNET: please check out my answer at the bottom
Antworten:
Sie können keine benutzerdefinierten Parameter in übergeben.
addTarget:
Eine Alternative besteht darin, dietag
Eigenschaft der Schaltfläche festzulegen und basierend auf dem Tag zu arbeiten.Oder für Swift 2.2 und höher:
Führen Sie nun eine Logik aus, die auf der
tag
Eigenschaft basiertquelle
Int
. Nichts anderes.Wenn Sie zusätzliche Parameter an die buttonClicked-Methode senden möchten, z. B. einen indexPath oder einen urlString, können Sie den UIButton in Unterklassen unterteilen:
Stellen Sie sicher, dass Sie die Klasse der Schaltfläche im Identitätsinspektor in die Unterklasse UIButton ändern. Sie können mit
sender.indexPath
oder auf die Parameter in der buttonClicked-Methode zugreifensender.urlString
.Hinweis: Wenn sich Ihre Schaltfläche in einer Zelle befindet, können Sie den Wert dieser zusätzlichen Parameter in der cellForRowAtIndexPath-Methode festlegen (in der die Schaltfläche erstellt wird).
quelle
Ich schätze jeden, der sagt, Tags verwenden, aber wirklich müssen Sie die UIButton-Klasse erweitern und einfach das Objekt dort hinzufügen.
Tags sind ein hoffnungsloser Weg, um dies zu umgehen. Erweitern Sie den UIButton wie folgt (in Swift 4)
dann kann Ihr Anruf ein Anruf sein (HINWEIS DER Doppelpunkt ":" in
Selector(("webButtonTouched:"))
)dann endlich alles hier fangen
Sie tun dies einmal und verwenden es während Ihres gesamten Projekts (Sie können sogar dafür sorgen, dass die untergeordnete Klasse ein generisches "Objekt" hat und alles, was Sie möchten, in die Schaltfläche einfügt!). Oder verwenden Sie das obige Beispiel, um eine unerschöpfliche Anzahl von Schlüssel- / Zeichenfolgenparametern in die Schaltfläche einzufügen. Wirklich nützlich, um Dinge wie URLs einzuschließen, die Nachrichtenmethode zu bestätigen usw.
Abgesehen davon ist es wichtig, dass die
SO
Community erkennt, dass eine ganze Generation von schlechten Praktiken im Internet von einer alarmierenden Anzahl von Programmierern abgeschnitten und eingefügt wird, die den Punkt nicht verstehen / nicht unterrichtet / verpasst haben das Konzept vonobject extensions
quelle
Für Swift 3.0 können Sie Folgendes verwenden
quelle
Swift 4.2
Ergebnis:
In der Datei
UIButton+Events.swift
habe ich eine Erweiterungsmethode erstelltUIButton
, die aUIControl.Event
an einen Completion-Handler mit dem Namen bindetEventHandler
:Der Grund, warum ich eine benutzerdefinierte Klasse zum Binden des Ereignisses verwendet habe, besteht darin, dass ich die Referenz später entsorgen kann, wenn die Schaltfläche deintialisiert wird. Dadurch wird verhindert, dass ein möglicher Speicherverlust auftritt. Dies war innerhalb der
UIButton
Erweiterung nicht möglich , da ich weder eine Eigenschaft noch diedeinit
Methode implementieren darf .quelle
Wenn Sie eine Reihe von Schaltflächen wie ich haben, können Sie so etwas ausprobieren
quelle
Swift 4.0 Code (Jetzt geht es wieder los)
Die aufgerufene Aktion sollte wie folgt markiert sein, da dies die Syntax für die schnelle Funktion zum Exportieren von Funktionen in die objektive c-Sprache ist.
Erstellen Sie eine Arbeitsschaltfläche:
quelle
Schneller 5.0-Code
Ich benutze theButton.tag, aber wenn ich viele Optionen habe, ist es ein sehr langer Schalterfall.
.
quelle
Für Swift 2.X und höher
quelle
Schneller 3.0-Code
Sie können einen Wert in 'userinfo' senden und diesen als Parameter in der Funktion verwenden.
quelle
Dies ist eher ein wichtiger Kommentar. Teilen von Referenzen von Sytanx, die sofort akzeptabel sind. Für Hack-Lösungen schauen Sie sich andere Antworten an.
Gemäß den Apple-Dokumenten müssen die Definitionen der Aktionsmethoden eine dieser drei sein. Alles andere wird nicht akzeptiert.
quelle