Ios

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をそれぞれ呼び出して、コードを渡すかどうかを確認しますコントロールを作成することで機能します。