2016-04-23 14 views
0

UIButtonの拡張をいくつか作成しようとしていますので、カスタムボタンにプロトコルを追加するだけで簡単に機能を追加できます。私がUIButtonのいくつかのメソッドをオーバーライドする必要がなければ、もっと簡単になるでしょう。だから私はUIButtonの拡張をしなければならないと思っています。拡張UIButtonはプロトコルに準拠している場合のみ

// 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) 
    } 
} 
:これまでのところ、私は唯一の制約のない UIButtonの拡張子(これらの簡略化されたバージョン)を作成するために管理

protocol CustomLayer { } 

protocol ButtonSound { } 

は例えば、私は私のカスタムボタンが準拠することができ、いくつかのプロトコルを持っています

私は記事を読んだ。クラスのwhere句を使ってプロトコル自体の拡張機能を作ることができる。

extension CustomLayer where Self: UIButton { } 

しかし、UIButtonの方法をオーバーライドすることはできません。それは多重継承のための潜在的につながるようあなたが拡張子に制約を追加することはできません

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

:サブクラス化作品が、特定のボタンのよう

その他の提案は、同じ機能を持つことができません – Paulw11

+0

"button"にプロトコル準拠を追加するだけでは、それをいくつかの 'UIButton'サブクラスに追加することはできません。したがって、これらのサブクラスの拡張を行うだけです。 –

+0

@ Paulw11:私はそれを恐れていました。この質問を作成する際に、複数の継承を持っていることに気付きました。私は質問を開いたままにしておきますが、他にもいくつかの提案が表示されるかもしれません。答えをありがとう。 –

答えて

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) 
     } 
    } 

} 
関連する問題