簡體   English   中英

即使我們不像其他 ViewController 生命周期方法那樣在 viewcontroller 中覆蓋它,是否也會調用 loadView?

[英]does loadView get called even if we don't override it in viewcontroller like the other ViewController lifecycle methods?

即使我們沒有像其他 ViewController 生命周期方法一樣在視圖 controller 中覆蓋它,是否也會調用 loadView? 即使我們不重寫 ViewDidLoad 方法,我們也知道這個生命周期方法將在 ios 內部調用。 LoadView 也會發生同樣的事情嗎? 還是僅在 VC 中的視圖為 nil 或我們顯式覆蓋它時才調用它?

它總是被調用。 文檔中,

視圖 controller 在其視圖屬性被請求但當前為 nil 時調用此方法。 此方法加載或創建視圖並將其分配給視圖屬性。

如果視圖 controller 具有關聯的 nib 文件,則此方法從 nib 文件加載視圖。 A view controller has an associated nib file if the nibName property returns a non-nil value, which occurs if the view controller was instantiated from a storyboard, if you explicitly assigned it a nib file using the init(nibName:bundle:) method,或者如果 iOS 在應用程序包中找到一個 nib 文件,其名稱基於視圖控制器的 class 名稱。 如果視圖 controller 沒有關聯的 nib 文件,則此方法將創建一個普通的 UIView object 代替。

...

您可以覆蓋此方法以手動創建視圖。 如果您選擇這樣做,請將視圖層次結構的根視圖分配給視圖屬性。 您創建的視圖應該是唯一的實例,並且不應與任何其他視圖 controller object 共享。 此方法的自定義實現不應調用 super。

即使您不覆蓋它,它也會被調用。 通常,僅當您不想從其 nib 創建視圖 controller 時才會覆蓋它。 在此方法中,您將為self.view分配一些值(因為view是延遲加載的)。 如果您沒有為您的視圖屬性分配一些特殊的子類,您通常可以通過將所有邏輯添加到viewDidLoad()來獲得。

這是一個示例實現:

// Say you have some custom view you want use as your controller's view
class CustomView: UIView { ... } 

...
// In your view controller, you can set that custom instance to your view property.
override func loadView() {
    self.view = CustomView()
}

例如, UITableViewController在此方法UITableView設置為您的視圖(大概)。

默認情況下,視圖只是一個普通的 UIView。 如果這就是您所需要的,那么根本沒有理由調用此方法。 viewDidLoad()仍然是進行任何額外初始化的絕佳場所。

有幾件事要記住:

  1. 僅在loadView()中分配給您的視圖。 不要調用它(在右側;不要調用它的 getter),因為這會導致無限循環。 如果view為 nil,則調用loadView來創建它。
  2. 不要調用super.loadView() 此方法旨在將視圖分配給您的視圖屬性。 通過調用 super,您將執行此操作兩次。

有關您可能陷入的無限循環陷阱的更多信息:

從 UIViewController 的角度來看

如果您訪問此屬性並且其值當前為 nil,則視圖 controller 會自動調用 loadView() 方法並返回結果視圖。

view為 nil 時,在loadView()中創建並分配視圖。 如果您在loadView本身中執行此操作,您將提示loadView在其自身的主體中被調用。

是的,它仍然會被調用。 您將觀察到與將其添加到視圖 controller 相同的行為。

override func loadView() {
  // Only call this to observe this is being called.
  // If you want to write your own implementation, you shouldn't call super.loadView().
  // Instead, create your own UIView instance and set self.view = yourView.
  super.loadView() 
}

暫無
暫無

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

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