簡體   English   中英

通過情節提要進行快速初始化

[英]Swift initialization from storyboard

我是一位語言入門的新手,我對類初始化有疑問。

當您使用空的ViewController啟動新項目時,如下所示:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
 }

由於ViewControllerUIViewController的子類,並且具有指定的初始化程序init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) 運行代碼時,“誰”會將參數放入初始化程序中? 是情節提要嗎?

如果是這樣,那么如果我的ViewController中有一個存儲屬性,需要指定的初始化程序來初始化我的存儲屬性,這將導致初始化鏈中斷,這意味着情節提要不再必須初始化您的ViewController

我知道這對於初學者來說是一種誤導,但是在這種情況下,任何人都不會調用初始值設定項。 您討論的ViewController實例位於情節提要文件中,這將導致我稍后進入的初始化路徑。 如果在其他地方以編程方式創建ViewController並從應用程序捆綁包中為其分配特定的筆尖,則可以使用您提到的方法。

各種模板都依賴於最終由運行時系統在啟動應用程序時完成的應用程序過程:當應用程序啟動時,它會查看其Info.plist以確定最初要加載的故事板。 在各種Xcode模板中,通常是Main.storyboard (然后指定了ViewController類型的初始視圖控制器)。 您的項目不會執行“生成的代碼”之類的操作,因為執行此操作的是Application對象。 在Objective-C項目中,您實際上可以看到這一點,因為入口點是常規的舊main方法(在main.m )。 Swift運行時不顯示此內容,它是您的應用程序使用的鏈接框架的一部分。

為此,現在重要的是要了解情節提要(以及與此相關的xib文件)的工作原理:對於應用程序,它們使用常規指定的初始化程序創建各種對象並不像“配方”。 它們包含序列化形式的實際上已經創建的對象。 這意味着在編譯應用程序時,將創建ViewController並將其“存檔”到情節提要/ xib中。 在這一點上,它無法知道與情節提要/ xib中其他對象的各種連接,因為它正在構建所述情節提要(這就是為什么您無法使用init出口對這些對象做有意義的事情的原因尚未創建)。 僅在完成創建和存檔后,各種連接才會(也)保存/添加到情節提要/ xib中。

現在,如果已啟動已編譯的應用程序,並且已加載Info.plist指定的Main.storyboard ,則該應用程序將從中取消存檔初始視圖控制器。 為此,它不使用您提到的ViewControllerinit方法,而是使用其對應的init(coder:) 之后,它將各種出口和動作與故事板(或場景)中未存檔的其他相關對象連接起來。 然后,它加載視圖,這導致對viewDidLoad的調用。 這也解釋了為什么您只能對其中加載了故事板的視圖控制器執行任何相關的初始化,而不能在init中進行init

現在,最后,您的問題是:您根本無法擁有依賴於在運行時期間調用的初始視圖控制器的指定初始化程序的屬性。 事實並非如此。 這也是大多數ViewController實現不覆蓋init的原因,幾乎沒有什么可以做的有意義的事情。 您可以使用三個選項來初始化任何東西:

  1. 覆蓋init(coder:) 請注意,您不一定知道故事板或場景中的哪些其他對象尚未存檔,並且還沒有建立連接,因此您只能在此處進行不需要這些對象的操作。
  2. 實現awakeFromNib 在取消存檔並建立到其他未存檔對象的所有連接后立即從xib(以及擴展情節提要圖板場景)加載的任何對象都需要調用此方法。 請注意,對於不是從情節提要中取消存檔而是在運行時以編程方式實例化的ViewControllers ,情況並非如此。 還有一些其他警告。
  3. viewDidLoad初始化所有必要的東西。 僅在實際加載ViewController的視圖時(即通常在將要顯示它時)才調用此方法,但是我猜總是最終會如此。 通常我會這樣。

如果您發現自己不得不在指定的初始化程序中初始化某些東西,並且想知道為什么從情節提要中加載視圖控制器時,為什么會丟失某些東西,請不要忘記在init(coder:) init中做任何事情。並可能也包含在encode(encoder:) 我很少有這樣的情況。 為了提供有關何時和如何完成的更詳細的說明,我需要您提供更多的有關您認為必須在init完成的信息。 在我的頭頂上,我可以想到添加到情節提要場景中的自定義視圖(而不是視圖控制器),但是這個答案已經足夠長了……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM