2013-03-07 8 views
23

私はUIViewをサブクラス化しようとしています。私はすでにいくつかの指定された初期化子を持っており、私は自分のカスタムビューをコードかNibファイルから初期化する可能性を持っています。 Appleは指定されたイニシャライザを使用するように指示しましたが、それ自体は行っていません。initWithCoder:initWithFrame:を呼び出しません。私の指定されたイニシャライザを両方の状況で呼び出させるにはどうすればよいですか?それをする方法はありませんか?initWithFrame:とinitWithCoderの両方をオーバーライドする方法:UIViewのサブクラスでは?

+0

たちは '含める必要はありませんこちらをご覧ください取り、コードサンプルhttp://stackoverflow.com/a/17798646/381807 – nesimtunc

答えて

39

特殊な初期化を1つの方法でパックします。プライベート(.mで宣言されている)でもかまいません。 次に、両方の初期化子をオーバーライドし、それらの中からinitメソッドを呼び出します。

- (void)myInitialization 
{ 
    //do your stuff 
} 

- (id)initWithFrame:(CGRect)aRect 
{ 
    self = [super initWithFrame:aRect]; 

    if (self) 
    { 
     [self myInitialization]; 
    } 

    return self; 
} 

- (id)initWithCoder:(NSCoder*)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     [self myInitialization]; 
    } 

    return self; 
} 
+0

を参照してください - (instancetype)初期化子init' ..?念のため。私は客観的なCを初めて使っています。 – shashwat

+0

'UIView'のサブクラスは_simple_' init'でほとんど初期化されません。同じ場合には、 'init'も含めることができます。つまり、ある種のビューが通常は固定フレームなどで初期化される場合です。 –

5

あなたが言ったように:

initWithFrame: - それは、あなたがこのメソッドを実装することをお勧めします。 は、このメソッドの代わりにカスタム初期化メソッドを実装することも、 を実装することもできます。

initWithCoder: Interface Builder nibファイルからビューをロードし、ビューにカスタム の初期化が必要な場合は、このメソッドを実装します。

私がやることは、両方とも呼び出す方法であり、あなたのUIViewに実装したい共通の動作があります。

関連する問題