iOS initWithFrame、initWithCoder、およびawakeFromNib間の差異分析
Difference Analysis Between Ios Initwithframe
元の住所:: https://www.cnblogs.com/yajunLi/p/6344023.html
関連記事
1、 iOSのinitWithFrameメソッドの理解 -------- https://www.cnblogs.com/lv14/articles/5013262.html
2、iOS開発ピットはinitWithFrameを行わず、init2つのメソッドが配置されます--- https://www.jianshu.com/p/4439f15b852f
3、initおよびinitWithFrameの書き換え注----- https://blog.csdn.net/hccgk/article/details/79461282
ビューコントロールをカスタマイズする必要がある場合、initWithFrame、initWithCoder、およびawakeFromNibの3つのシステムメソッドがあります。これらの3つのメソッドが呼び出されると、それらをどのように呼び出すかによって、多くの人が混乱することがあります。
以下に、コード例と組み合わせた理論について説明します。
1、initWithFrame
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame] if (self) { NSLog(@'initWithFrame') [self initViews] } return self }
このメソッドは、次のように、コントロールがxib、ストーリーボードから作成されていない場合に呼び出されます。
XibShow *xib = [[XibShow alloc] initWithFrame:CGRectMake(0, 330, KScreenWidth, 100)] [self.view addSubview:xib]
ここでは、[XibShow alloc] initWithFrameを直接使用してコントロールを作成しているため、カスタムコントロール内では、initWithFrameメソッドのみが使用され、他の2つは使用されません。
2、initWithCoder
- (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder] if (self) { NSLog(@'initWithCoder') [self initViews] } return self }
このメソッドは、コントロールがxib、ストーリーボードから作成されるときに呼び出されます。
一般的な理解は次のとおりです。ビューまたはセルは、xibで直接作成されるなど、xibまたはストーリーボードに反映されるか、既存のクラスに関連付けられたプルコントロールです。
さらに、カスタムビューが純粋なコードであっても、xibはありませんが、vcのxibで引用しましたが、効果は同じです。
たとえば、これら2つの方法で作成されたカスタムビューは、xibまたはストーリーボードで参照している限り、initWithCoderとawakeFromNibを実行します。
3、awakeFromNib
-(void)awakeFromNib{ NSLog(@'awakeFromNib') [super awakeFromNib] [self initViews] }
このメソッドは、initWithCoder:メソッドの後に、initWithCoder-> awakeFromNibの順序で呼び出されます(以下にコードのスクリーンショットがあります)
-次のように理解できます。
最初にinitWithCoderによって作成されたコントロールは無効になり、その後awakeFromNibを介してウェイクアップするため、呼び出しの順序が順番になります。
具体的な例を次に示します。
1. vcを作成し、ストーリーボードにインターフェイスを関連付け、インターフェイスにビューを追加し、カスタムビューXibShowを関連付けます。
2、vcで、追加のコードを使用してカスタムビューコントロールを追加し、別の場所に追加します。
このようにして、実行の結果は次のようになります。
その中でも、印刷順序は上図のようになります。
それは発見することができます:
1. viewDidLoadの前に、ストーリーボード上に作成されたクラスであるため、最初に実行され、initWithCoderとawakeFromNibの2つのメソッドに従います。
2、viewDidLoadの後、コードで作成されたビューに対して実行します。initWithFrameメソッドのみを実行します。
PS:ここに小さな詳細があります。背景色を指定した場合でも、ストーリーボードのコントロールによって作成されたクラスを作成しましたが、実装はカスタムビュー自体の背景色に基づいています。
(上の写真を見ると、灰色が設定されていますが、まだ赤です)
最終要約:
1、initWithFrameは、純粋なコードが作成された場合にのみ適用され、xibやストーリーボードは含まれません。
2、initWithCoder、awakeFromNibは、xib、ストーリーボードから作成されたときに呼び出されます。
3、したがって、一般的に、セキュリティ上の理由から、メソッドで記述したコントロールを初期化するコード(上記の私のinitViewsメソッドと同様)、次にinitWithFrameとinitWithCoderをそれぞれ呼び出して、コードを渡すかどうかを確認しますコントロールを作成することで機能します。