UIViewController関連ライフサイクルまとめ(転載)
3675 ワード
前言
何気なくこのブログを見て、とても役に立つと思って、書いたのも深く浅くて、だから私の原文の住所に転載します
関連ライフサイクルメソッドの呼び出しタイミング
awakeFromNib
ビューがStoryboardまたはNibファイルからロードされると、このメソッドが呼び出され、すべてのオブジェクトが作成された後にのみ呼び出されます.
ここでは追加の「Set Up」の仕事をすることができます.
このメソッドが呼び出されると、すべてのnibファイルのオブジェクトが作成され、すべてのIBOutletsとActionが確立されます.
このメソッドを上書きする場合はsuperメソッドを呼び出す必要があります.デフォルトのsuperメソッドでは実装されていません.
また、Archiveとしてオブジェクトをインスタンス化しているため、ViewControllerは初期化時にinitWithCoder:を呼び出している.手動でinitを呼び出すとnibファイルからロードされません.
このメソッドはloadNibName:クラスのメソッドを実行するときに呼び出されます.
loadView()
このメソッドは、ViewController作成後にself.viewをロードする必要がある場合に呼び出されます.このメソッドは直接呼び出されるべきではありません.
私たちのインタフェースがStoryboardで作成されている場合は、この方法を上書きするべきではありません.
ViewControllerが次のような場合、このメソッドではnibファイルからView:1.View Controllerがstoryboardからインスタンス化されます.2.
この関数でself.viewプロパティを呼び出すとデッドループになります.
このメソッドが上書きされた場合、superメソッドは呼び出されません.
viewDidLoad()
このメソッドは、ViewControllerのViewがロードされると呼び出されるため、通常は1回しか呼び出されません.
このときviewはまだview hierarchyに組み込まれておらず、メモリにロードされているだけです.ここで
このメソッドを上書きする場合はsuperメソッドを呼び出す必要があります.
デッドサイクル問題
viewWillAppear
viewDidAppear
何気なくこのブログを見て、とても役に立つと思って、書いたのも深く浅くて、だから私の原文の住所に転載します
関連ライフサイクルメソッドの呼び出しタイミング
awakeFromNib
ビューがStoryboardまたはNibファイルからロードされると、このメソッドが呼び出され、すべてのオブジェクトが作成された後にのみ呼び出されます.
ここでは追加の「Set Up」の仕事をすることができます.
このメソッドが呼び出されると、すべてのnibファイルのオブジェクトが作成され、すべてのIBOutletsとActionが確立されます.
このメソッドを上書きする場合はsuperメソッドを呼び出す必要があります.デフォルトのsuperメソッドでは実装されていません.
また、Archiveとしてオブジェクトをインスタンス化しているため、ViewControllerは初期化時にinitWithCoder:を呼び出している.手動でinitを呼び出すとnibファイルからロードされません.
このメソッドはloadNibName:クラスのメソッドを実行するときに呼び出されます.
loadView()
このメソッドは、ViewController作成後にself.viewをロードする必要がある場合に呼び出されます.このメソッドは直接呼び出されるべきではありません.
私たちのインタフェースがStoryboardで作成されている場合は、この方法を上書きするべきではありません.
ViewControllerが次のような場合、このメソッドではnibファイルからView:1.View Controllerがstoryboardからインスタンス化されます.2.
initWithNibName:bundle:
によって初期化される.3.App Bundleには、このクラス名と同じnibファイル名があります.self.view
を呼び出すと、self.view
がnilでない場合、オブジェクトが直接呼び出されます.nilの場合、self.loadView()
を呼び出してUIViewを作成し、このオブジェクトをself.view
に割り当てます.この関数でself.viewプロパティを呼び出すとデッドループになります.
self.view
にアクセスすると、この属性が空であることがわかり、loadView()
メソッドが呼び出され、デッドサイクルが発生します.このメソッドが上書きされた場合、superメソッドは呼び出されません.
viewDidLoad()
このメソッドは、ViewControllerのViewがロードされると呼び出されるため、通常は1回しか呼び出されません.
viewDidLoad()
において、UIButtonのコンテンツを設定するなど、Viewを設定することができる.ビューがnibファイルからロードされている場合は、この設定を行うことができます.このときviewはまだview hierarchyに組み込まれておらず、メモリにロードされているだけです.ここで
self.presentViewController
などの操作を実行するとエラーが発生します.このメソッドを上書きする場合はsuperメソッドを呼び出す必要があります.
デッドサイクル問題
self.view
が空の場合、loadView()
が呼び出されます.次の場合、デッドサイクルが発生します.var str = "loadView"
override func loadView() {
// self.view
str = "loadView"
print(str)
}
override func viewDidLoad() {
// self.view
str = "viewDidLoad"
print(str)
let newView = self.view
}```
:
>loadView viewDidLoad
>loadView
>viewDidLoad
>loadView
>viewDidLoad
`newView` nil。
` loadView()` self.view, `viewDidLoad()` `self.view` , TODO。( `let newView = self.view` )。 `loadView()` `self.view`, 。
## viewWillAppear
View View Hierarchy , View 。 , View 。
frame , View View Hierarchy, 。
__ super 。__
## viewWillLayoutSubviews
`ViewController.view` Subviews 。 , 、 layout。
AutoLayout 。
## viewDidLayoutSubviews
, 。
AutoLayout 。
## viewDidAppear
, 。
#
## AutoLayout Frame
AutoLayout UITextView, Frame :
## viewDidLoad
frame = (20 40; 560 160); contentSize: {560, 133}; contentOffset: {0, 0}; ``` viewWillAppear
frame = (20 40; 560 160);
contentOffset: {0, 0};
contentSize: {560, 133}; ```
## viewWillLayoutSubviews
frame = (20 40; 560 160); contentOffset: {0, 0}; contentSize: {560, 133};
## viewDidLayoutSubviews
frame = (20 40; 374 296); contentOffset: {0, -15}; contentSize: {374, 184} ``` viewDidAppear
frame = (20 40; 374 296);
contentOffset: {0, -15};
contentSize: {374, 184}; ```
, ` viewDidLayoutSubview` , UITextView Frame , `contentSize` `contentOffset` 。
` viewWillAppear` , view , 。
`viewWillAppear` , UITextView 。
,viewWillLayoutSubview viewDidLayoutSubviews 。 , 。