2017-01-22 17 views
0

私のアプリでは、CustomLabel, CustomView, CustomTextFieldなどのインターフェイス要素があります(すべてカスタムクラスは基本クラスから継承します)UIView, UILabel, UITextField この時点では、各要素DrawRect自分自身にアンダーラインを描画する関数へのコールバックと基本的には、各サブクラスに重複したコードの塊があります またはを必要としないので、extensionUIViewに作成せずに、 subclassUIViewこの現象が発生します。UITextField、UILabel、UIViewカスタムクラスにカスタム機能を追加する

+0

残念ながら、 'UIView'が一般的なスーパークラスであるため、できません – Paulw11

+0

これは正しい方法で管理できますか? –

+0

それを見て、ありがとう! –

答えて

3

このために、プロトコルとプロトコル拡張を使用して、共通メソッドをサブクラスに追加することができます。次に、クラスをそのプロトコルに準拠させ、プロトコルからメソッドを呼び出すためにdrawRectをオーバーライドするだけです。残念ながら、プロトコルに準拠し、他の変更を行わずに新しい動作を追加することは不可能です。プロトコル拡張のメソッドをオーバーライドすることはできません。メソッドのスウィズルを可能にするObjective-Cランタイムを使用するメソッドを追加することはできません。

のコードでは、これは次のようになります:

protocol CustomDrawing {} 

extension CustomDrawing where Self: UIView { 
    func myDrawingCode() { 
     // Whatever 
    } 
} 

をあなたは、このようにそれを使用します。

class CustomLabel: UILabel, CustomDrawing { 
    override func draw(_ rect: CGRect) { 
     super.draw(rect) 
     myDrawingCode() 
    } 
} 

あなたがする必要がありますmyDrawingCode()でいくつかの共通のプロパティまたはメソッドにアクセスする必要がある場合それらをCustomDrawingプロトコルの中で宣言してください。プロトコル拡張がUIViewとサブタイプに制約されているため、UIViewメソッドを使用できます。

関連する問題