นี่สำหรับ 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ถูกอัปเดต