2016-07-04 12 views
3

Ich habe eine UIButton. Ich möchte das gleiche UIButton verwenden, um mehrere Aktionen auszuführen. Zuerst setze ich die Aktion programmgesteuert auf eine Schaltfläche.Ist es möglich, die Aktionsmethode für UIButton in Swift zu überschreiben?

button1.addTarget(self, action: #selector(ViewController.function1), forControlEvents: .TouchUpInside) 

Als nächstes möchte ich diese Funktion verwerfen und andere Aktionen hinzufügen.

button1.addTarget(self, action: #selector(ViewController.function2), forControlEvents: .TouchUpInside) 

Kann das vorhandene Ziel für die Schaltfläche überschrieben werden?

+0

Es Zugabe nicht machen Wenn Sie mehr als ein addTarget zu einer Schaltfläche verwenden, lautet das High-Level-Argumentation: "button -> IBAction, dann entwickeln Sie Ihre Bedingung innerhalb der Aktionsmethode. –

Antwort

3

den Fall Sie nicht die vorherige Aktion vorschlagen außer Kraft setzen, aber die zweite Aktion auf die Schaltfläche in ViewController.function1 und ViewController.function2 resultierenden hinzufügen aufgerufen wird.

Sie müssen die vorherige Aktion vom Ziel zu entfernen, bevor neue Zugabe von

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)

verwenden oder alle bisherigen Aktionen entfernen, bevor der neue

button1.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

4

Sie müssen die vorherige Aktion vom Ziel entfernen, bevor neue sonst Zugabe es verursacht sowohl die Aktionen

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents) 
0

auslösen Wenn Sie das Ziel hinzugefügt haben, können Sie entfernen Sie sie mit removeTarget Methode auf Taste:

func removeTarget(_ target: AnyObject?, 
     action action: Selector, 
forControlEvents controlEvents: UIControlEvents) 

EDIT: Siehe @Rohit KP Antwort zum Beispiel der Nutzung. Allerdings möchten Sie vielleicht zu prüfen, etwas anderes mit, dass‘.AllEvents“, je nachdem, was Sie brauchen.

2

Ich recommande Sie eine Wrapper-Funktion zu erstellen. Da das Hinzufügen/Entfernen Ziel dynamisch kann, führt zu Dead-Lock.

So Sie müssen wahrscheinlich eine Funktion erstellen, die immer dann aufgerufen werden, und tun Sie Ihre Sachen in:

@IBOutlet func myWrapper(sender : AnyObject?) { 

if (conditionA) { 
    // do stuff A 
} else { 
    // do stuff B 
} 
} 
+0

Können Sie uns einen Fall von Deadlock anbieten? –

+1

Dies ist die vernünftigste Antwort und konform mit Apple Framework. –

+0

Nein, ich kann nicht, weil ich Ihren Code nicht kenne. Ich meine, Sie befinden sich möglicherweise in einem Zustand, in dem Sie alle Ziele entfernen oder 2 Ziele hinzufügen. Es ist wirklich schwer zu sichern. Eine if-else-Anweisung ist der sicherere Weg (und debuggable Weg), um Ihr Ziel zu erreichen – CZ54

Verwandte Themen