亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

-viewWillAppear:和-viewDidAppear:有什么區別?

-viewWillAppear:和-viewDidAppear:有什么區別?

iOS
一只斗牛犬 2019-10-14 10:55:54
-[UIViewController viewWillAppear:]和之間有什么區別-[UIViewController viewDidAppear:]?
查看完整描述

3 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

總的來說,這就是我要做的:

1)ViewDidLoad-每當我向應該與該視圖一起顯示的視圖添加控件時,我都會立即將其放在ViewDidLoad方法中?;旧希灰獙⒁晥D加載到內存中,就會調用此方法。因此,例如,如果我的視圖是帶有3個標簽的表單,則可以在此處添加標簽;例如,沒有這些形式,視圖將永遠不存在。

2)ViewWillAppear:我通常使用ViewWillAppear只是為了更新表單上的數據。因此,對于上面的示例,我將使用它來將域中的數據實際加載到表單中。創建UIView相當昂貴,您應該避免在ViewWillAppear方法上執行盡可能多的操作,因為調用該方法時,它意味著iPhone已經準備好向用戶顯示UIView,而您在此處所做的任何繁重的工作將以非常明顯的方式影響性能(例如動畫被延遲等)。

3)ViewDidAppear:最后,我使用ViewDidAppear為需要很長時間才能執行的事情啟動新線程,例如進行webservice調用以獲取上述表單的額外數據,這是因為視圖已經存在并正在顯示給用戶,則可以在獲取數據時向用戶顯示一個不錯的“等待”消息。


查看完整回答
反對 回復 2019-10-14
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

viewDidLoad === >>>將您的初始化代碼放在這里。不要放置在視圖生命周期中可能發生變化的動態數據。因此,如果您要從核心數據中提取數據,則在此視圖的生命周期內這種情況可能會發生變化時,您不想在此處進行操作。例如:說您有一個標簽控制器。您從tab1切換到tab2,并在tab2中的模型上進行了更改。如果返回tab1并且您的模型代碼在viewDidLoad中完成,則不會更新(假設您未使用KVO或NSFetchedResultsController等)。

viewWillAppear === >>>每當視圖即將出現時,無論視圖是否已經在內存中,都會調用此方法。將動態代碼放在這里,例如模型邏輯。

viewDidAppear === >>>僅在確定視圖在屏幕上(例如網絡調用)時,才需要執行昂貴的操作。

注意:如果您的應用程序是后臺運行并返回到前臺,則需要使用NSNotificationCenter進行處理。我在下面的注釋中為此編寫了代碼。您可能認為viewWillAppear / viewDidAppear將觸發。在此處放置一個斷點并對其進行測試。它不會開火。因此,如果您的應用在后臺運行時發生了變化,則需要使用通知進行更新。


查看完整回答
反對 回復 2019-10-14
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

一些觀察:

  • viewDidLoad首次實例化視圖時調用該方法。IBOutlet引用是在調用它的時間(而不是在此之前)連接的。但是frame,視圖的調用可能尚未建立。這是添加/配置子視圖及其關聯約束的好地方。但是,如果您要frame根據主視圖的尺寸進行任何手動的值配置,則應將這些框架的配置推遲到viewWillAppearviewDidLayoutSubviews。

  • viewWillAppear當視圖層次結構中的視圖表示即將開始時,將調用該方法。值得注意的是,這是在視圖呈現的動畫(如果有)的開始處調用的。viewWillDisappear當離開此視圖的過渡開始時,顯然會調用其伴侶。

  • viewDidAppear當完成視圖的呈現時,尤其是在完成所有關聯的動畫之后,將調用此方法。viewDidDisappear當完成離開此視圖的轉換時,顯然會調用它的同伴。

兩個重要警告:

  • viewDidLoad首次實例化視圖時,僅調用一次,并且僅調用一次。另一方面,不僅會在首次顯示視圖時調用,viewWillAppear而且viewDidAppear還會在以后的每一次重新顯示所討論的相同視圖時調用。例如,當您首次顯示視圖時,將同時調用這三種方法。如果有問題的觀點隨后呈現隨后被解雇時,另一種觀點認為viewWillAppear,并viewDidAppear在有問題的視圖添加和動畫回視圖層次一般會被再次調用,但viewDidLoad不會。viewDidLoad僅在首次創建此特定實例時調用。

    因此,如果您希望每次重新顯示視圖時都執行某項操作(例如,關閉或彈出視圖),請在viewWillAppear或中進行操作viewDidAppear。如果希望僅在首次實例化視圖時才發生,請在中進行viewDidLoad。

  • 的調用viewWillAppear并不保證將完全完成向該視圖的轉換。值得注意的是,如果您使用的是由實時用戶輸入驅動的交互式轉換,但是可以取消該交互式轉換。即,僅因為viewWillAppear被調用,并不意味著viewDidAppear將被調用。通常是這樣,但是如果取消了交互式筆勢,則不會(因為過渡從未完成)。

    在WWDC 2013上,在交互式過渡的上下文中,演示者開玩笑說應將其重命名viewWillAppear為“ viewMightAppear,或viewWillProbablyAppeariReallyWishThisViewWouldAppear”。

    內置交互手勢的一個示例是當使用a時UINavigationController,您“從左邊緣滑動”以啟動視圖彈出。該viewWillAppear會呼吁給你如雨后春筍般冒出的觀點,但如果取消,“從左側邊緣滑動”要返回從中啟動此彈出的姿態來看,在彈出被取消,viewDidAppear該視圖你開始彈出回到永遠不會被調用。

    這樣做的最終結果是,您應注意不要編寫假定每個viewWillAppear最終都會調用的代碼viewDidAppear。如果取消過渡,則情況并非如此。


查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 1603 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號