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