กำลังมองหาที่จะเข้าใจวงจรชีวิตของ iOS UIViewController


299

คุณช่วยอธิบายวิธีจัดการUIViewControllerวงจรชีวิตให้ฉันได้ไหม?

โดยเฉพาะอย่างยิ่งผมอยากจะทราบวิธีการใช้Initialize, ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnloadและDisposeวิธีการในการโมโนสัมผัสสำหรับUIViewControllerระดับ


มีข้อมูลหรือลิงค์สำหรับ OSX ViewController และ WindowController บ้างไหม? กรุณาแบ่งปัน
Anoop Vaidya

คำตอบ:


410

คำสั่งทั้งหมดเหล่านี้จะถูกเรียกโดยอัตโนมัติตามเวลาที่เหมาะสมโดย iOS เมื่อคุณโหลด / ปัจจุบัน / ซ่อนตัวควบคุมมุมมอง เป็นสิ่งสำคัญที่จะต้องทราบว่าวิธีการเหล่านี้มีการแนบUIViewControllerและไม่ให้UIViewตัวเอง คุณจะไม่ได้รับการใด ๆ UIViewของคุณสมบัติเหล่านี้เพียงแค่ใช้

มีเอกสารที่ดีในเว็บไซต์ของ Apple ที่นี่ ใส่ในเพียงว่า:

  • ViewDidLoad- เรียกว่าเมื่อคุณสร้างคลาสและโหลดจาก xib ยอดเยี่ยมสำหรับการตั้งค่าเริ่มต้นและทำงานเพียงครั้งเดียวเท่านั้น

  • ViewWillAppear- ถูกเรียกก่อนมุมมองของคุณจะดีสำหรับการซ่อน / แสดงฟิลด์หรือการดำเนินการใด ๆ ที่คุณต้องการให้เกิดขึ้นทุกครั้งก่อนที่จะเห็นมุมมอง เนื่องจากคุณอาจกลับไปกลับมาระหว่างมุมมองต่างๆสิ่งนี้จะถูกเรียกทุกครั้งที่มุมมองของคุณปรากฏบนหน้าจอ

  • ViewDidAppear - ถูกเรียกหลังจากมุมมองปรากฏขึ้น - เป็นจุดที่เหมาะสำหรับการเริ่มต้นภาพเคลื่อนไหวหรือการโหลดข้อมูลภายนอกจาก API

  • ViewWillDisappear/ DidDisappear- ความคิดเช่นเดียวกับ/ViewWillAppearViewDidAppear

  • ViewDidUnload/ ViewDidDispose- ใน Objective-C นี่คือที่ที่คุณทำการล้างและปล่อยสิ่งต่าง ๆ แต่สิ่งนี้ถูกจัดการโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องทำที่นี่มากนัก


86
ข้อความนี้ทำให้เข้าใจผิดเล็กน้อยเนื่องจาก ViewDidLoad ไม่ควรใช้สำหรับการทำงานเพียงครั้งเดียวเท่านั้น อาจถูกเรียกหลายครั้งหากไม่ได้โหลดมุมมองเนื่องจากหน่วยความจำเหลือน้อยจากนั้นโหลดอีกครั้ง
Ricky Helgesson

4
ViewDidLoad ไม่ได้ถูกเรียกจริงเมื่อคุณสร้าง / เตรียมใช้งานตัวควบคุมมุมมอง มันถูกเรียกว่าเป็นครั้งแรกที่คุณทำมุมมองใด ๆ ที่เกี่ยวข้องกับมุมมองของตัวควบคุมมุมมอง เช่นเพิ่มเป็นมุมมองย่อยตั้งค่ากรอบ ฯลฯ มันถูกเรียกว่าแน่นอนเมื่อโหลดจากปลายปากกา
Jason Grandelli

3
ViewDidAppear - เรียกหลังมุมมองปรากฏ - เป็นสถานที่ที่เหมาะสำหรับการเริ่มต้นภาพเคลื่อนไหวหรือการโหลดข้อมูลภายนอกจาก API ทำไมจึงเป็นจุดเริ่มต้นที่ดีในการโหลดข้อมูล? ทำไมไม่ลองโหลดดูล่ะ?
Anton Chikin

1
เกี่ยวกับวิธี loadView ถ้ามันถูกเรียกครั้งแรกเมื่อปลายปากกาโหลดในหน่วยความจำก่อนที่จะ viewDidLoad หรือไม่
iHulk

@ จักรีนี่เป็นจุดที่ดี - viewDidAppear เป็นสถานที่ที่ดีในการรีเฟรชข้อมูล (ถ้าคุณต้องการ) ฉันไม่เห็นด้วยกับ KVO เพราะอาจทำให้เกิดการรีเฟรชที่ไม่พึงประสงค์ในมุมมองที่ผู้ใช้ไม่เคยดูจริง ๆ
Anton Chikin

409

อัปเดต: ViewDidUnload เลิกใช้แล้วใน iOS 6 ดังนั้นอัปเดตคำตอบตามนั้น

วงจรชีวิตของ UIViewController มีไดอะแกรมที่นี่:

วงจรชีวิตของตัวควบคุมมุมมองไดอะแกรม

ข้อดีของการใช้ Xamarin Native / Mono Touch คือใช้ API ดั้งเดิมและดังนั้นจึงเป็นไปตามวงจรชีวิตของ ViewController เช่นเดียวกับที่คุณพบในเอกสารประกอบของ Apple


17
viewWillLayoutSubviews และ viewDidLayoutSubviews จะไปที่แผนผังลำดับงานนี้ได้ที่ไหน
Max_Power89

7
แผนภาพนี้ไม่ถูกต้อง viewDidUnload เลิกใช้แล้วตั้งแต่ iOS6: stackoverflow.com/questions/12509102/…
occulus

2
นี่เป็นเพียงแค่การที่ไม่ถูกต้อง อีกตัวอย่างหนึ่งของคำตอบที่ผิดพลาดใน SO เมื่อหลายปีที่ผ่านมา การคำนวณไม่คงที่สูง
Fattie

186

นี่สำหรับ iOS เวอร์ชันล่าสุด (แก้ไขด้วยXcode 9.3, Swift 4.1 ) ด้านล่างนี้เป็นขั้นตอนทั้งหมดที่ทำให้วงจรชีวิตUIViewControllerสมบูรณ์

  • loadView()

  • loadViewIfNeeded()

  • viewDidLoad()

  • viewWillAppear(_ animated: Bool)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear(_ animated: Bool)

  • viewWillDisappear(_ animated: Bool)

  • viewDidDisappear(_ animated: Bool)

ผมขออธิบายทุกขั้นตอนเหล่านั้น

1 loadView

เหตุการณ์นี้สร้าง / โหลดมุมมองที่ตัวควบคุมจัดการ สามารถโหลดจากไฟล์ปลายปากกาที่เชื่อมโยงหรือว่างเปล่าUIViewถ้าพบว่าเป็นโมฆะ สิ่งนี้ทำให้เป็นจุดที่ดีในการสร้างมุมมองของคุณในโค้ดโดยทางโปรแกรม

นี่คือที่ subclasses ควรสร้างลำดับชั้นมุมมองที่กำหนดเองของพวกเขาหากพวกเขาไม่ได้ใช้ปลายปากกา ไม่ควรถูกเรียกโดยตรง แทนที่เมธอดนี้เมื่อคุณสร้างมุมมองโดยทางโปรแกรมและกำหนดมุมมองรูทให้กับviewคุณสมบัติอย่าเรียกใช้เมธอด super เมื่อคุณแทนที่ loadView

2 loadViewIfNeeded

หากviewControllerไม่ได้ตั้งค่ามุมมองของกระแสหากยังไม่ได้ตั้งค่าวิธีการนี้จะโหลดมุมมอง แต่โปรดจำไว้ว่าจะมีเฉพาะใน iOS> = 9.0 ดังนั้นหากคุณรองรับ iOS <9.0 อย่าคาดหวังว่ามันจะเข้ามาในรูป

โหลดมุมมองของตัวควบคุมมุมมองหากยังไม่ได้ตั้งค่า

3 viewDidLoad

viewDidLoadเหตุการณ์ที่เรียกว่าเฉพาะเมื่อมุมมองถูกสร้างขึ้นและโหลดลงในหน่วยความจำ แต่ขอบเขตสำหรับมุมมองยังไม่ได้กำหนดเลย นี่เป็นสถานที่ที่ดีในการเริ่มต้นวัตถุที่ตัวควบคุมมุมมองจะใช้

เรียกว่าหลังจากโหลดมุมมองแล้ว สำหรับตัวควบคุมมุมมองที่สร้างขึ้นในรหัสนี่คือ after -loadView สำหรับตัวควบคุมมุมมองที่ไม่ได้เก็บถาวรจากปลายปากกานี่คือหลังจากตั้งค่ามุมมองแล้ว

4 viewWillAppear

เหตุการณ์นี้จะแจ้งให้ทราบviewControllerเมื่อใดก็ตามที่มุมมองปรากฏบนหน้าจอ ในขั้นตอนนี้มุมมองจะมีขอบเขตที่กำหนดไว้ แต่ไม่ได้ตั้งค่าการวางแนว

เรียกว่าเมื่อมุมมองที่จะทำให้มองเห็นได้ ค่าเริ่มต้นไม่ทำอะไรเลย

5 viewWillLayoutSubviews

นี่เป็นขั้นตอนแรกในวงจรชีวิตที่สิ้นสุดขอบเขต หากคุณไม่ได้ใช้ข้อ จำกัด หรือเลย์เอาต์อัตโนมัติคุณอาจต้องการอัปเดตข้อมูลย่อยที่นี่ มีให้เฉพาะใน iOS> = 5.0 ดังนั้นหากคุณรองรับ iOS <5.0 อย่าคาดหวังว่ามันจะเข้ามาในรูป

เรียกว่าก่อนที่เมธอด layoutSubviews มุมมองของตัวควบคุมมุมมองถูกเรียกใช้ คลาสย่อยสามารถใช้งานได้ตามความจำเป็น ค่าเริ่มต้นคือ nop

6 viewDidLayoutSubviews

เหตุการณ์นี้แจ้งให้ทราบถึงตัวควบคุมมุมมองที่มีการตั้งค่าการดูย่อย เป็นสถานที่ที่ดีในการเปลี่ยนแปลงการดูย่อยหลังจากที่ตั้งค่าไว้แล้ว มีให้เฉพาะใน iOS> = 5.0 ดังนั้นหากคุณรองรับ iOS <5.0 อย่าคาดหวังว่ามันจะเข้ามาในรูป

เรียกว่าหลังจากเมธอด layoutSubviews มุมมองของตัวควบคุมมุมมองถูกเรียกใช้ คลาสย่อยสามารถใช้งานได้ตามความจำเป็น ค่าเริ่มต้นคือ nop

7 viewDidAppear

viewDidAppearเหตุการณ์ fires หลังจากมุมมองที่จะนำเสนอบนหน้าจอ ซึ่งทำให้เป็นสถานที่ที่ดีในการรับข้อมูลจากบริการแบ็กเอนด์หรือฐานข้อมูล

เรียกว่าเมื่อมีการเปลี่ยนมุมมองไปยังหน้าจออย่างสมบูรณ์ ค่าเริ่มต้นไม่ทำอะไรเลย

8 viewWillDisappear

viewWillDisappearเหตุการณ์ fires เมื่อมุมมองของที่นำเสนอviewControllerเป็นเรื่องเกี่ยวกับที่จะหายไป, viewControllerยกเลิกปกหรือซ่อนอยู่เบื้องหลังอื่น ๆ นี้เป็นสถานที่ที่ดีที่คุณสามารถ จำกัด ของคุณโทรเครือข่าย, viewControllerตั้งเวลาหรือปล่อยโมฆะวัตถุที่ถูกผูกไว้กับที่

ถูกเรียกเมื่อมุมมองถูกปิดครอบคลุมหรือซ่อนไว้เป็นอย่างอื่น

9 viewDidDisappear

นี่เป็นขั้นตอนสุดท้ายของวงจรชีวิตที่ทุกคนสามารถพูดได้เมื่อเหตุการณ์นี้เกิดขึ้นหลังจากที่มุมมองของการนำเสนอviewControllerหายไปถูกปิดครอบคลุมหรือซ่อน

ถูกเรียกหลังจากมุมมองถูกปิดครอบคลุมหรือซ่อนไว้เป็นอย่างอื่น ค่าเริ่มต้นไม่ทำอะไรเลย

ตอนนี้ตามAppleเมื่อคุณใช้วิธีการนี้คุณควรจำไว้ว่าให้เรียกsuperการใช้งานของวิธีการเฉพาะนั้น

หากคุณ subclass UIViewController คุณต้องเรียกใช้งาน super ของวิธีนี้แม้ว่าคุณจะไม่ได้ใช้ NIB (เพื่อความสะดวกวิธีการเริ่มต้นที่เป็นค่าเริ่มต้นจะทำสิ่งนี้ให้คุณและระบุศูนย์สำหรับอาร์กิวเมนต์ทั้งสองวิธีนี้) ใน NIB ที่ระบุพร็อกซีของเจ้าของไฟล์ควรมีคลาสที่ถูกตั้งค่าเป็นคลาสย่อยของตัวควบคุมมุมมอง เชื่อมต่อกับมุมมองหลัก หากคุณเรียกใช้เมธอดนี้ด้วยชื่อ nil nib ดังนั้น-loadViewเมธอดคลาสนี้จะพยายามโหลด NIB ที่มีชื่อเหมือนกับคลาสของตัวควบคุมมุมมองของคุณ หากไม่มี NIB จริง ๆ แล้วคุณจะต้องโทร-setView:ก่อน-viewหรือถูกแทนที่ด้วย-loadViewวิธีการตั้งค่ามุมมองของคุณโดยทางโปรแกรม

หวังว่านี่จะช่วยได้ ขอบคุณ

อัปเดต - ตามที่ @ThomasW ชี้ภายในความคิดเห็นviewWillLayoutSubviewsและviewDidLayoutSubviewsจะถูกเรียกอีกครั้งเมื่อมีการโหลดมุมมองย่อยของมุมมองหลักเช่นเมื่อโหลดเซลล์ของมุมมองตารางหรือมุมมองคอลเลกชัน

อัปเดต - เนื่องจาก @Maria ชี้ความคิดเห็นภายในคำอธิบายของloadViewถูกอัปเดต


6
viewWillLayoutSubviewsและviewDidLayoutSubviewsจะถูกเรียกในเวลาอื่นเมื่อโหลดมุมมองย่อยของมุมมองหลักเช่นเมื่อโหลดเซลล์ของมุมมองตารางหรือมุมมองคอลเลกชัน
ThomasW

คำตอบนี้มีความเข้าใจผิดเล็กน้อย: loadView () ถูกเรียกเสมอมันไม่ควรถูกเขียนทับเมื่อมุมมองสำหรับคอนโทรลเลอร์ที่สร้างใน IB
Maria

@Maria โปรดดำเนินการต่อและแก้ไขคำตอบหากคุณคิดว่าจะปรับปรุงได้ ขอบคุณ
onCompletion

viewWillAppear viewDidAppear viewDidDisappearเริ่มต้นไม่ได้ทำอะไรที่ไม่ถูกต้องสำหรับ คุณต้องเรียกซูเปอร์ในบางจุด
มิก

47

iOS 10,11 (Swift 3.1, Swift 4.0)

ตามที่UIViewControllerในUIKitการพัฒนา

1. loadView ()

นี่คือที่ subclasses ควรสร้างลำดับชั้นมุมมองของพวกเขาเองว่าพวกเขาจะไม่ได้ใช้ปลายปากกา ไม่ควรถูกเรียกโดยตรง

2. loadViewIfNeeded ()

โหลดมุมมองของตัวควบคุมมุมมองหากยังไม่ได้ตั้งค่า

3. viewDidLoad ()

เรียกว่าหลังจากโหลดมุมมองแล้ว สำหรับตัวควบคุมมุมมองที่สร้างขึ้นในรหัสนี่คือ after -loadView สำหรับตัวควบคุมมุมมองที่ไม่ได้เก็บถาวรจากปลายปากกานี่คือหลังจากตั้งค่ามุมมองแล้ว

4. viewWillAppear (_ animated: Bool)

เรียกว่าเมื่อมุมมองที่จะทำให้มองเห็นได้ ค่าเริ่มต้นไม่ทำอะไรเลย

5. viewWillLayoutSubviews ()

เรียกว่าก่อนที่เมธอด layoutSubviews มุมมองของตัวควบคุมมุมมองถูกเรียกใช้ คลาสย่อยสามารถใช้งานได้ตามความจำเป็น ค่าเริ่มต้นไม่ทำอะไรเลย

6. viewDidLayoutSubviews ()

เรียกว่าหลังจากเมธอด layoutSubviews มุมมองของตัวควบคุมมุมมองถูกเรียกใช้ คลาสย่อยสามารถใช้งานได้ตามความจำเป็น ค่าเริ่มต้นไม่ทำอะไรเลย

7. viewDidAppear (_ animated: Bool)

เรียกว่าเมื่อมีการเปลี่ยนมุมมองไปยังหน้าจออย่างสมบูรณ์ ค่าเริ่มต้นไม่ทำอะไรเลย

8. viewWillDisappear (_ animated: Bool)

ถูกเรียกเมื่อมุมมองถูกปิดครอบคลุมหรือซ่อนไว้เป็นอย่างอื่น ค่าเริ่มต้นไม่ทำอะไรเลย

9. viewDidDisappear (_ animated: Bool )

ถูกเรียกหลังจากมุมมองถูกปิดครอบคลุมหรือซ่อนไว้เป็นอย่างอื่น ค่าเริ่มต้นไม่ทำอะไรเลย

10. viewWillTransition (ตามขนาด: CGSize พร้อมผู้ประสานงาน: UIViewControllerTransitionCoordinator)

เรียกว่าเมื่อมุมมองกำลังเปลี่ยน

11. willMove (toParentViewController parent: UIViewController?)

12. didMove (toParentViewController parent: UIViewController?)

ทั้งสองวิธีนี้เป็นแบบสาธารณะสำหรับ subclasses คอนเทนเนอร์ที่จะเรียกเมื่อมีการเปลี่ยนแปลงระหว่างตัวควบคุมลูก หากพวกเขาถูกแทนที่การแทนที่ควรตรวจสอบการเรียก super

อาร์กิวเมนต์ผู้ปกครองในทั้งสองวิธีนี้เป็นศูนย์เมื่อเด็กจะถูกลบออกจากผู้ปกครอง; มิฉะนั้นจะเท่ากับตัวควบคุมมุมมองหลักใหม่

13. didReceiveMemoryWarning ()

เรียกว่าเมื่อแอปพลิเคชันหลักได้รับคำเตือนของหน่วยความจำ บน iOS 6.0 จะไม่ล้างมุมมองอีกต่อไปตามค่าเริ่มต้น


2
จริง ๆ แล้ว sux ที่ stackoverflow จะไม่ล้างคำตอบที่ไม่ถูกต้องและไม่สมบูรณ์ออกจากเธรดทั้งหมดนี้ ดูเหมือนว่าคำตอบของคุณจะเสร็จสมบูรณ์เท่าที่วิธีการโทรออกดังนั้นฉันจะถือว่าคุณถูกต้องและทำงานกับมัน
Logicsaurus Rex

อะไรคือสิ่งnibที่กล่าวถึงภายใต้loadView?
Petrus Theron

2
@LogicsaurusRex ฉันเห็นด้วย ในทำนองเดียวกับที่ SO ทำเครื่องหมายคำถามว่าซ้ำซ้อนหรือได้รับการปกป้องฉันคิดว่ามันควรจะสามารถทำเครื่องหมายคำตอบว่าล้าสมัยหรือล้าสมัยได้
rmp251

จุดที่ 5 ด้านบนผิด viewWillLayoutSubviews()เรียกว่าก่อนวัตถุมุมมองของ ViewController เรียกใช้layoutSubviews()วิธีการ
williamukoh

28

ตั้งแต่ iOS 6 เป็นต้นไป แผนภาพใหม่มีดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


1
เรียกมุมมองนั้นว่า "A" พิจารณามุมมองที่สอง "B" ที่ปรากฏขณะที่ "A" หายไป "B.viewWillAppear" ก่อนหรือหลัง "A.viewDidDisappear" หรือไม่ และมีสถานการณ์ใดบ้างที่ลำดับของการเปลี่ยนแปลงทั้งสองนี้?
ToolmakerSteve

ดูเหมือนว่า WillApear ของมุมมองใหม่จะถูกเรียกก่อนที่จะหายไป สำหรับคำถามที่สอง ต้องการเวลาในการตรวจสอบ
Saad

21

มาดูวิธีการที่รับผิดชอบวงจรชีวิตของ UIViewController :

  • การสร้าง:

    - (void)init

    - (void)initWithNibName:

  • ดูการสร้าง:

    - (BOOL)isViewLoaded

    - (void)loadView

    - (void)viewDidLoad

    - (UIView *)initWithFrame:(CGRect)frame

    - (UIView *)initWithCoder:(NSCoder *)coder

  • การจัดการการเปลี่ยนสถานะมุมมอง:

    - (void)viewDidLoad

    - (void)viewWillAppear:(BOOL)animated

    - (void)viewDidAppear:(BOOL)animated

    - (void)viewWillDisappear:(BOOL)animated

    - (void)viewDidDisappear:(BOOL)animated

    - (void)viewDidUnload

  • การจัดการคำเตือนหน่วยความจำ:

    - (void)didReceiveMemoryWarning

  • deallocation

    - (void)viewDidUnload

    - (void)dealloc

แผนภาพวงจรชีวิตของ UIViewController

สำหรับข้อมูลเพิ่มเติมโปรดดูในUIViewController ชั้นอ้างอิง


19

วิธีการviewWillLayoutSubviewsและviewDidLayoutSubviewsไม่ได้กล่าวถึงในแผนภาพ แต่เหล่านี้จะเรียกว่าระหว่างและviewWillAppear viewDidAppearสามารถเรียกได้หลายครั้ง


พวกเขาจะถูกเรียกในเวลาอื่นเมื่อโหลดมุมมองย่อยของมุมมองหลักเช่นเมื่อโหลดเซลล์ของมุมมองตารางหรือมุมมองคอลเลกชัน
ThomasW

16

คำตอบของผู้ไล่ล่านั้นถูกต้องสำหรับ pre-iOS 6 อย่างไรก็ตามตั้งแต่ iOS 6 viewDidUnload และ viewWillUnload จะไม่ถูกเรียก เอกสารรัฐ: "ผู้ชมจะถูกลบออกไม่อยู่ภายใต้สภาวะที่มีหน่วยความจำและดังนั้นวิธีการนี้จะไม่เรียกว่า."


ฉันพยายามใส่เบรกพอยต์ใน ViewWillDisappear, ViewDidDisappear, Dispose แต่ไม่มีพวกเขาถูกเรียกใช้เมื่อฉันสำรวจด้วยวิธี PresentViewController () อะไรคือเหตุผล?
Sreeraj

1
ลิงก์ไม่ทำงาน ... ดังนั้นระบบปฏิบัติการจะทำอย่างไรภายใต้หน่วยความจำเหลือน้อย
ลูกชาย

บันทึกลงดิสก์หรือไม่
Ian Warburton

16

มีข้อมูลที่ล้าสมัยและไม่สมบูรณ์จำนวนมากที่นี่ สำหรับiOS 6 และใหม่กว่าเท่านั้น:

  1. loadView[เป็น]
  2. viewDidLoad[เป็น]
  3. viewWillAppear
  4. viewWillLayoutSubviews เป็นครั้งแรกที่มีการสรุปขอบเขต
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. * viewWillLayoutSubviews[b]
  8. * viewDidLayoutSubviews[b]

เชิงอรรถ:

(ก) - หากคุณด้วยตนเอง Nil จากมุมมองของคุณในระหว่างdidReceiveMemoryWarning, loadViewและviewDidLoadจะได้รับการเรียกอีกครั้ง นั่นคือโดยค่าเริ่มต้นloadViewและviewDidLoadถูกเรียกเพียงครั้งเดียวต่อหนึ่งอินสแตนซ์ของตัวควบคุมมุมมอง

(b) อาจถูกเรียกอีก0หรือมากกว่าครั้ง


1
viewWillLayoutSubviewsและviewDidLayoutSubviewsจะถูกเรียกในเวลาอื่นเมื่อโหลดมุมมองย่อยของมุมมองหลักเช่นเมื่อโหลดเซลล์ของมุมมองตารางหรือมุมมองคอลเลกชัน
ThomasW

11

การอธิบายการเปลี่ยนสถานะในเอกสารอย่างเป็นทางการ: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html

ภาพนี้แสดงการเปลี่ยนสถานะที่ถูกต้องระหว่างวิธีการโทรกลับ 'ดู' และ 'ทำ' ที่ถูกต้อง

การเปลี่ยนสถานะที่ถูกต้อง:


นำมาจาก: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png


0

ตามเอกสารของ Apple - เริ่มต้นพัฒนาแอพ iOS (Swift) - ทำงานกับ View Controllers - ทำความเข้าใจกับ View Controller Lifecycle

viewDidLoad()- เรียกเมื่อมุมมองเนื้อหาของตัวควบคุมมุมมอง (ด้านบนของลำดับชั้นการดู) ถูกสร้างและโหลดจากกระดานเรื่องราว ... ใช้วิธีนี้เพื่อทำการตั้งค่าเพิ่มเติมตามที่คุณต้องการ

viewWillAppear()- เรียกก่อนเพิ่มมุมมองเนื้อหาของมุมมองเนื้อหาลงในลำดับชั้นมุมมองของแอป ใช้วิธีนี้เพื่อทริกเกอร์การดำเนินการใด ๆ ที่ต้องเกิดขึ้นก่อนที่จะมีการนำเสนอมุมมองเนื้อหาบนหน้าจอ

viewDidAppear()- เรียกใช้หลังจากเพิ่มมุมมองเนื้อหาของตัวควบคุมมุมมองในลำดับชั้นมุมมองของแอปแล้ว ใช้วิธีนี้เพื่อทริกเกอร์การดำเนินการใด ๆ ที่ต้องเกิดขึ้นทันทีที่มีการนำเสนอมุมมองบนหน้าจอเช่นการดึงข้อมูลหรือแสดงภาพเคลื่อนไหว

viewWillDisappear()- เรียกก่อนมุมมองเนื้อหาของตัวควบคุมมุมมองจะถูกลบออกจากลำดับชั้นการดูของแอป ใช้วิธีนี้เพื่อทำงานการล้างข้อมูลเช่นการยอมรับการเปลี่ยนแปลงหรือลาออกจากสถานะการตอบกลับแรก

viewDidDisappear()- เรียกใช้หลังจากลบมุมมองเนื้อหาของตัวควบคุมมุมมองออกจากลำดับชั้นการดูของแอปแล้ว ใช้วิธีนี้เพื่อทำกิจกรรมการฉีกขาดเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.