2016-04-23 11 views
0

Ich versuche, mehrere Erweiterungen für UIButton zu erstellen, so dass ich einfach durch Hinzufügen eines Protokolls zu einer benutzerdefinierten Schaltfläche einige Funktionen hinzufügen kann. Es wäre viel einfacher, wenn ich nicht einige Methoden in UIButton überschreiben müsste, also denke ich, dass ich eine Erweiterung für UIButton selbst machen muss.Extension UIButton nur wenn ich einem Protokoll zustimme

Zum Beispiel habe ich mehrere Protokolle meine-Buttons entsprechen können:

protocol CustomLayer { } 

protocol ButtonSound { } 

Bisher habe ich nur geschafft, eine Erweiterung für UIButton ohne Einschränkungen zu erstellen (diese sind vereinfachte Versionen):

// Only when the button conforms to protocol CustomLayer 
extension UIButton { 
    override public class func layerClass() -> AnyClass { return CAShapeLayer.self } 
} 

// Only when the button conforms to protocol ButtonSound 
extension UIButton { 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     super.touchesBegan(touches, withEvent: event) 

     AudioServicesPlaySystemSound(1104) 
    } 
} 

ich lese Beiträge habe ich eine Erweiterung für das Protokoll selbst mit einer für die Klasse, in der Klausel mache UIButton:

extension CustomLayer where Self: UIButton { } 

Aber dann kann ich keine Methoden von UIButton selbst überschreiben.

Andere Vorschläge wie Subklassifizieren funktioniert, aber bestimmte Tasten können die gleiche Funktionalität nicht haben:

class A: CustomLayer { } // Can't have ButtonSound, single subclass works 
class B: ButtonSound { } // Can't have CustomLayer, single subclass works 

class C: CustomLayer, ButtonSound { } // Error: multiple inheritance from classes 
+0

Sie keinen Zwang zu einer Erweiterung hinzufügen können, wie sie auf das Potential für Mehrfachvererbung führen würde – Paulw11

+0

Sie können nicht einfach Protokollkonformität zu "button" hinzufügen, Sie fügen es zu einer Unterklasse "UIButton" hinzu. Also machen Sie einfach Erweiterungen dieser Unterklassen. –

+0

@ Paulw11: Ich hatte Angst davor, bemerkte ich beim Erstellen dieser Frage in einigen Fällen hatte ich mehrere Erbschaften. Ich werde die Frage ein wenig offen lassen, vielleicht könnten andere Vorschläge auftauchen. Danke für die Antwort. –

Antwort

0
import Foundation 

protocol BackButtonDelegate { 

    func BackButtonAction(sender:UIButton) 
} 

class NavigationBack: UIButton 
{ 
    var delegate : BackButtonDelegate! 

    override func drawRect(rect: CGRect) { 
     self.frame = CGRectMake(0, 0, 60, 60) 
     self.setTitle("Back", forState: .Normal) 
     self.titleLabel?.font = UIFont(name: "Helvetica",size: 12) 
     self.setImage(UIImage(named: "back-arrow"), forState: .Normal) 

     self.addTarget(self, action: #selector(NavigationBack.click(_:)), forControlEvents: UIControlEvents.TouchUpInside) 

    } 
    func click(sender:UIButton) 
    { 
     if delegate != nil 
     { 
      delegate!.BackButtonAction(sender) 
     } 
    } 

}