Ich verwende addTarget: action: forControlEvents wie folgt:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
und ich möchte Parameter an meinen Selektor "switchToNewsDetails" übergeben. Das einzige, was mir gelingt, ist, den (ID-) Absender schriftlich zu übergeben:
action:@selector(switchToNewsDetails:)
Aber ich versuche Variablen wie ganzzahlige Werte zu übergeben. So zu schreiben funktioniert nicht:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Es funktioniert auch nicht so:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Jede Hilfe wäre dankbar :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
quelle
quelle
Antworten:
Sie übergeben hier keine Parameter an die
switchToNewsDetails:
Methode. Sie erstellen einfach einen Selektor, damit die Schaltfläche ihn aufrufen kann, wenn eine bestimmte Aktion ausgeführt wird (in Ihrem Fall nachbessern). Steuerelemente können drei Arten von Selektoren verwenden, um auf Aktionen zu reagieren. Alle haben eine vordefinierte Bedeutung ihrer Parameter:ohne Parameter
mit 1 Parameter, der die Steuerung angibt, die die Nachricht sendet
Mit 2 Parametern, die das Steuerelement angeben, das die Nachricht sendet, und das Ereignis, das die Nachricht ausgelöst hat:
Es ist nicht klar, was genau Sie versuchen, aber wenn Sie jeder Schaltfläche einen bestimmten Detailindex zuweisen möchten, können Sie Folgendes tun:
In der
switchToNewsDetails:
Methode können Sie diesen Index erhalten und die entsprechenden Details öffnen:quelle
[button.layer setValue:yourObject forKey:@"anyKey"];
und dann in der Methode überprüfen(objectClass *)[button.layer valueForKey:@"anyKey"];
, ob es sich um eine kostenlosere Version von.tag
Um benutzerdefinierte Parameter zusammen mit dem Klick auf die Schaltfläche zu übergeben, müssen Sie nur die UIButton-Taste SUBCLASSEN .
(ASR ist aktiviert, daher enthält der Code keine Releases.)
Dies ist myButton.h
Dies ist myButton.m
Verwendung:
Empfangsfunktion:
Wenn Sie möchten, dass ich in einem Teil des obigen Codes genauer bin, können Sie dies gerne in den Kommentaren nachfragen.
quelle
tag
Eigenschaft in Android-Ansichten ähnlich ist . Sie können jedes Objekt speichern. Sie können Objekte auch wie in einem Wörterbuch / einer Karte nach Schlüssel speichern .Zielaktion ermöglicht drei verschiedene Formen der Aktionsauswahl:
quelle
Benötigen Sie mehr als nur ein (int) via .tag? Verwenden Sie KVC!
Sie können beliebige Daten über das Schaltflächenobjekt selbst übergeben (indem Sie auf CALayers keyValue dict zugreifen).
Stellen Sie Ihr Ziel so ein (mit dem ":")
Fügen Sie Ihre Daten der Schaltfläche selbst (und
.layer
der Schaltfläche) folgendermaßen hinzu:Wenn Sie dann auf die Schaltfläche tippen, können Sie dies folgendermaßen überprüfen:
quelle
Ich habe eine Lösung gefunden, die teilweise auf den obigen Informationen basiert. Ich setze einfach den Titel titlelabel.text auf die Zeichenfolge, die ich übergeben möchte, und setze den Titel titlelabel.hidden = YES
So was :
Auf diese Weise ist keine Vererbung oder Kategorie erforderlich, und es liegt kein Speicherverlust vor
quelle
Ich habe mehrere Tasten für jede Telefonnummer in einem Array erstellt, sodass jede Taste eine andere Telefonnummer zum Anrufen benötigte. Ich habe die setTag-Funktion verwendet, als ich mehrere Schaltflächen innerhalb einer for-Schleife erstellt habe:
Dann habe ich in meiner call: -Methode dieselbe for-Schleife und eine if-Anweisung verwendet, um die richtige Telefonnummer auszuwählen:
quelle
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Da es hier viele Möglichkeiten für die Lösung gibt, außer Kategoriefunktion.
Zum Beispiel (ex):
in Ihrer Ansicht Controller.m
Ereignishandler:
quelle
Sie können die Zielaktion durch einen Abschluss (Block in Objective-C) ersetzen, indem Sie einen Hilfsverschluss-Wrapper (ClosureSleeve) hinzufügen und ihn dem Steuerelement als zugehöriges Objekt hinzufügen, damit es beibehalten wird. Auf diese Weise können Sie beliebige Parameter übergeben.
Swift 3
Verwendung:
quelle
self.switchToNewsDetails(parameter: i)
) 2 mal feuern, warum mir helfenbutton.addAction()
zweimal anrufen . Fügen Sie einen Haltepunkt zubutton.addAction
und auch in der ersten Zeile innerhalb des Verschlusses hinzu und versuchen Sie, ihn selbst zu debuggen.Es gibt eine andere Möglichkeit, wie Sie indexPath der Zelle abrufen können, in der Ihre Schaltfläche gedrückt wurde:
mit dem üblichen Aktionswähler wie:
und dann in Ihrer Funktion:
Da Sie einen Indexpfad erhalten, wird dieser viel einfacher.
quelle
Siehe meinen Kommentar oben, und ich glaube, Sie müssen NSInvocation verwenden, wenn es mehr als einen Parameter gibt
Weitere Informationen zu NSInvocation finden Sie hier
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
quelle
Dies hat mein Problem behoben, ist aber abgestürzt, sofern ich mich nicht geändert habe
zu
quelle
Ich habe UIButton in CustomButton untergeordnet und eine Eigenschaft hinzugefügt, in der ich meine Daten speichere. Also rufe ich die Methode: (CustomButton *) sender auf und lese in der Methode nur meine Daten sender.myproperty.
Beispiel CustomButton:
Methodenaktion:
Aktion zuweisen
quelle
Wenn Sie nur den Text für das vom Navigationscontroller angezeigte leftBarButtonItem zusammen mit der neuen Ansicht ändern möchten, können Sie den Titel der aktuellen Ansicht ändern, bevor Sie pushViewController in den gewünschten Text aufrufen, und ihn im viewHasDisappered-Rückruf für zukünftige Anzeigen von wiederherstellen die aktuelle Ansicht.
Dieser Ansatz behält die Funktionalität (popViewController) und das Erscheinungsbild des angezeigten Pfeils bei.
Es funktioniert für uns zumindest mit iOS 12, das mit Xcode 10.1 erstellt wurde ...
quelle