シーケンスイメージボード要素はNibによって記述される(feat.awakeFromNib)


StackOverflow: awakeFromNib, outlets and storyboards: is the documentation wrong?
🐶 シーケンスイメージボードをコンパイルします.
Xcodeでアプリケーションを構築すると、シーケンスイメージボードのコンパイルが行われます.
次に、Info.plist.nibのファイルを含むパッケージを取得します.以下に示します.
:; pwd
/Users/mayoff/Library/<snip>/Pinner.app/Base.lproj/Main.storyboardc
:; ll
total 80
drwxr-xr-x  10 mayoff  staff   340 May 11 22:13 ./
drwxr-xr-x   4 mayoff  staff   136 May 11 22:13 ../
-rw-r--r--   1 mayoff  staff  1700 May 11 22:13 AccountCollection.nib
-rw-r--r--   1 mayoff  staff  1110 May 11 22:13 AccountEditor.nib
-rw-r--r--   1 mayoff  staff  2999 May 11 22:13 BYZ-38-t0r-view-8bC-Xf-vdC.nib
-rw-r--r--   1 mayoff  staff   439 May 11 22:13 Info.plist
-rw-r--r--   1 mayoff  staff  7621 May 11 22:13 LqH-9K-CeF-view-OwT-Ts-HoG.nib
-rw-r--r--   1 mayoff  staff  6570 May 11 22:13 OZq-QF-pn5-view-xSR-gK-reL.nib
-rw-r--r--   1 mayoff  staff  2473 May 11 22:13 UINavigationController-ZKB-z3-xgf.nib
-rw-r--r--   1 mayoff  staff   847 May 11 22:13 UIPageViewController-ufv-JN-y6U.nib
🐱 Info.plistInfo.plistは、シーケンス画像ボード内の特定の条件を満たすシーンおよび対応するNibファイル名を含む.
特定の条件は、シーケンスイメージボードID、Segueのターゲット、またはルートシーンがある場合にのみInfoを持つことです.plistに含める
:; plutil -p Info.plist 
{
  "UIViewControllerIdentifiersToNibNames" => {
    "AccountCollection" => "AccountCollection"
    "UINavigationController-ZKB-z3-xgf" => "UINavigationController-ZKB-z3-xgf"
    "UIPageViewController-ufv-JN-y6U" => "UIPageViewController-ufv-JN-y6U"
    "AccountEditor" => "AccountEditor"
  }
  "UIStoryboardDesignatedEntryPointIdentifier" => "UINavigationController-ZKB-z3-xgf"
  "UIStoryboardVersion" => 1
}
🐭 Nibファイル
今、Nibファイルについて正式に話しましょう.
つまり、シーケンスイメージボードのコンパイルによって生成されるNibファイルには、次の2つがあります.
Nib Sceneの最上位オブジェクトのみを格納
  • (2)サブビューレイヤを格納するNiib
  • 1.Sceneのtop-levelオブジェクトのみを格納するNib
    前述の24142に格納されたNib
    これらのnibファイルには、対応するシーンのtop-levelオブジェクト情報が含まれています.
    (ビュープロファイルはtop-level object)
    上記の例で示した共通名nibに対応
    ⑪「サブビューレイヤーを格納するNibファイル」の名前もあります.
    :; strings - AccountCollection.nib |grep -e '-.*-'
    UIPageViewController-ufv-JN-y6U
    BYZ-38-t0r-view-8bC-Xf-vdC          <---------
    UpstreamPlaceholder-5Hn-fK-fqQ
    UpstreamPlaceholder-8GL-mk-Rao
    q1g-aL-SLo.title
    2.サブビューレイヤーを格納するNib
    サブビュー階層は、個別のnibファイルに含まれます.
    ⑪このnibファイルの名前は、「ビューコンテンツID」と「最上位サブビューID」です.
    (オブジェクトIDは「Identity Inspector」で入手可能であることに注意してください)
    例えば、AccountCollectionというシーンのView Con IDがInfo.plistであり、ビューCon内のtop-level View IDがAccountCollection.nibであるとする
    このシーンのviewレイヤのnibファイル名はAccountEditor.nibです.
    ⑪シーンにサブレイヤーがない場合、ビューコンテキストのNibのみがサブレイヤーのNibを持っていない.
    🦊 ビューコンテキストとSubviewレイヤのAwakeFromNib()の結果は違いますか?
    勘定科目のAwakeFromNib()バー
    このメソッドは、Nibファイルをソースとして作成したオブジェクトが初期化完了時に呼び出されます.
    つまり、BYZ-38-t0rメソッドを呼び出すと、所有しているすべてのIBoutletが初期化後に接続され、アクセス可能になる必要があります.
    АААААААААААААА
    シーケンスイメージボードに配置されたビューは、8bC-Xf-vdCを呼び出すと、サブビューまで正常に初期化され、独自のoutlet/actionにアクセスできます.
    ただし、ビューアのBYZ-38-t0r-view-8bC-Xf-vdC.nibポイントでout/actionにアクセスできません.
    これは、前述のAwakeFromNib()定義に違反しています.どうしてこんなことになったの?
    АААААААААААААААА
    アプリケーションがシーケンスイメージボードからシーンをロードすると、コンテキストの表示などの最上位オブジェクトNibがロードされます.
    この場合、Nibローダはtop-level object Nibのみをロードし、その中のサブビューレイヤNibをロードしないとawakeFromNib()メッセージが送信される.
    したがって、outlet/actionのようなサブビューレイヤは、ビューアのAwakeFromNib()ポイントで初期化されていない.
    セカンダリビューレイヤのNibファイルは、ビューコンがawakeFromNib()メソッドでawakeFromNib() Propertyを要求するまでロードされません.
    このプロセス中、awakeFromNib()メソッドは、サブビューをNibから分離し、サブビュー階層オブジェクトを所有者ビューコンテンツのoutlet/actionに接続する
    NibローダがサブビューレイヤNibローディングを完了すると、loadView()メッセージがサブビューレイヤオブジェクトに渡されます.viewが終了すると、instantiateWithOwner()に関するメッセージがビーコンに送信される.