3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
總的來(lái)說(shuō),這就是我要做的:
1)ViewDidLoad-每當(dāng)我向應(yīng)該與該視圖一起顯示的視圖添加控件時(shí),我都會(huì)立即將其放在ViewDidLoad方法中?;旧?,只要將視圖加載到內(nèi)存中,就會(huì)調(diào)用此方法。因此,例如,如果我的視圖是帶有3個(gè)標(biāo)簽的表單,則可以在此處添加標(biāo)簽;例如,沒(méi)有這些形式,視圖將永遠(yuǎn)不存在。
2)ViewWillAppear:我通常使用ViewWillAppear只是為了更新表單上的數(shù)據(jù)。因此,對(duì)于上面的示例,我將使用它來(lái)將域中的數(shù)據(jù)實(shí)際加載到表單中。創(chuàng)建UIView相當(dāng)昂貴,您應(yīng)該避免在ViewWillAppear方法上執(zhí)行盡可能多的操作,因?yàn)檎{(diào)用該方法時(shí),它意味著iPhone已經(jīng)準(zhǔn)備好向用戶顯示UIView,而您在此處所做的任何繁重的工作將以非常明顯的方式影響性能(例如動(dòng)畫(huà)被延遲等)。
3)ViewDidAppear:最后,我使用ViewDidAppear為需要很長(zhǎng)時(shí)間才能執(zhí)行的事情啟動(dòng)新線程,例如進(jìn)行webservice調(diào)用以獲取上述表單的額外數(shù)據(jù),這是因?yàn)橐晥D已經(jīng)存在并正在顯示給用戶,則可以在獲取數(shù)據(jù)時(shí)向用戶顯示一個(gè)不錯(cuò)的“等待”消息。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
viewDidLoad === >>>將您的初始化代碼放在這里。不要放置在視圖生命周期中可能發(fā)生變化的動(dòng)態(tài)數(shù)據(jù)。因此,如果您要從核心數(shù)據(jù)中提取數(shù)據(jù),則在此視圖的生命周期內(nèi)這種情況可能會(huì)發(fā)生變化時(shí),您不想在此處進(jìn)行操作。例如:說(shuō)您有一個(gè)標(biāo)簽控制器。您從tab1切換到tab2,并在tab2中的模型上進(jìn)行了更改。如果返回tab1并且您的模型代碼在viewDidLoad中完成,則不會(huì)更新(假設(shè)您未使用KVO或NSFetchedResultsController等)。
viewWillAppear === >>>每當(dāng)視圖即將出現(xiàn)時(shí),無(wú)論視圖是否已經(jīng)在內(nèi)存中,都會(huì)調(diào)用此方法。將動(dòng)態(tài)代碼放在這里,例如模型邏輯。
viewDidAppear === >>>僅在確定視圖在屏幕上(例如網(wǎng)絡(luò)調(diào)用)時(shí),才需要執(zhí)行昂貴的操作。
注意:如果您的應(yīng)用程序是后臺(tái)運(yùn)行并返回到前臺(tái),則需要使用NSNotificationCenter進(jìn)行處理。我在下面的注釋中為此編寫(xiě)了代碼。您可能認(rèn)為viewWillAppear / viewDidAppear將觸發(fā)。在此處放置一個(gè)斷點(diǎn)并對(duì)其進(jìn)行測(cè)試。它不會(huì)開(kāi)火。因此,如果您的應(yīng)用在后臺(tái)運(yùn)行時(shí)發(fā)生了變化,則需要使用通知進(jìn)行更新。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
一些觀察:
viewDidLoad
首次實(shí)例化視圖時(shí)調(diào)用該方法。IBOutlet
引用是在調(diào)用它的時(shí)間(而不是在此之前)連接的。但是frame
,視圖的調(diào)用可能尚未建立。這是添加/配置子視圖及其關(guān)聯(lián)約束的好地方。但是,如果您要frame
根據(jù)主視圖的尺寸進(jìn)行任何手動(dòng)的值配置,則應(yīng)將這些框架的配置推遲到viewWillAppear
或viewDidLayoutSubviews
。viewWillAppear
當(dāng)視圖層次結(jié)構(gòu)中的視圖表示即將開(kāi)始時(shí),將調(diào)用該方法。值得注意的是,這是在視圖呈現(xiàn)的動(dòng)畫(huà)(如果有)的開(kāi)始處調(diào)用的。viewWillDisappear
當(dāng)離開(kāi)此視圖的過(guò)渡開(kāi)始時(shí),顯然會(huì)調(diào)用其伴侶。viewDidAppear
當(dāng)完成視圖的呈現(xiàn)時(shí),尤其是在完成所有關(guān)聯(lián)的動(dòng)畫(huà)之后,將調(diào)用此方法。viewDidDisappear
當(dāng)完成離開(kāi)此視圖的轉(zhuǎn)換時(shí),顯然會(huì)調(diào)用它的同伴。
兩個(gè)重要警告:
viewDidLoad
首次實(shí)例化視圖時(shí),僅調(diào)用一次,并且僅調(diào)用一次。另一方面,不僅會(huì)在首次顯示視圖時(shí)調(diào)用,viewWillAppear
而且viewDidAppear
還會(huì)在以后的每一次重新顯示所討論的相同視圖時(shí)調(diào)用。例如,當(dāng)您首次顯示視圖時(shí),將同時(shí)調(diào)用這三種方法。如果有問(wèn)題的觀點(diǎn)隨后呈現(xiàn)隨后被解雇時(shí),另一種觀點(diǎn)認(rèn)為viewWillAppear
,并viewDidAppear
在有問(wèn)題的視圖添加和動(dòng)畫(huà)回視圖層次一般會(huì)被再次調(diào)用,但viewDidLoad
不會(huì)。viewDidLoad
僅在首次創(chuàng)建此特定實(shí)例時(shí)調(diào)用。因此,如果您希望每次重新顯示視圖時(shí)都執(zhí)行某項(xiàng)操作(例如,關(guān)閉或彈出視圖),請(qǐng)?jiān)?code>viewWillAppear或中進(jìn)行操作
viewDidAppear
。如果希望僅在首次實(shí)例化視圖時(shí)才發(fā)生,請(qǐng)?jiān)谥羞M(jìn)行viewDidLoad
。的調(diào)用
viewWillAppear
并不保證將完全完成向該視圖的轉(zhuǎn)換。值得注意的是,如果您使用的是由實(shí)時(shí)用戶輸入驅(qū)動(dòng)的交互式轉(zhuǎn)換,但是可以取消該交互式轉(zhuǎn)換。即,僅因?yàn)?code>viewWillAppear被調(diào)用,并不意味著viewDidAppear
將被調(diào)用。通常是這樣,但是如果取消了交互式筆勢(shì),則不會(huì)(因?yàn)檫^(guò)渡從未完成)。在WWDC 2013上,在交互式過(guò)渡的上下文中,演示者開(kāi)玩笑說(shuō)應(yīng)將其重命名
viewWillAppear
為“viewMightAppear
,或viewWillProbablyAppear
或iReallyWishThisViewWouldAppear
”。內(nèi)置交互手勢(shì)的一個(gè)示例是當(dāng)使用a時(shí)
UINavigationController
,您“從左邊緣滑動(dòng)”以啟動(dòng)視圖彈出。該viewWillAppear
會(huì)呼吁給你如雨后春筍般冒出的觀點(diǎn),但如果取消,“從左側(cè)邊緣滑動(dòng)”要返回從中啟動(dòng)此彈出的姿態(tài)來(lái)看,在彈出被取消,viewDidAppear
該視圖你開(kāi)始彈出回到永遠(yuǎn)不會(huì)被調(diào)用。這樣做的最終結(jié)果是,您應(yīng)注意不要編寫(xiě)假定每個(gè)
viewWillAppear
最終都會(huì)調(diào)用的代碼viewDidAppear
。如果取消過(guò)渡,則情況并非如此。
- 3 回答
- 0 關(guān)注
- 1593 瀏覽
添加回答
舉報(bào)