ความแตกต่างระหว่าง viewDidLoad และ viewDidAppear


86

อะไรคือความแตกต่างระหว่างviewDidLoadและviewDidAppear? การกำหนดค่าเริ่มต้นหรือโค้ดที่กำหนดเองประเภทใดที่เข้าสู่ฟังก์ชันเหล่านั้น

เช่นpresentModalViewControllerทำงานเฉพาะเมื่ออยู่ในและไม่ได้อยู่ในviewDidAppearviewDidLoad


คำตอบ:


148

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

viewDidAppearถูกเรียกเมื่อมุมมองนั้นสามารถมองเห็นได้จริงและสามารถเรียกได้หลายครั้งในช่วงอายุการใช้งานของ View Controller (ตัวอย่างเช่นเมื่อปิด Modal View Controller และมุมมองจะปรากฏขึ้นอีกครั้ง) นี่คือที่ที่คุณต้องการดำเนินการจัดวางหรือวาดรูปใด ๆ ใน UI ตัวอย่างเช่นการนำเสนอตัวควบคุมมุมมองโมดอล อย่างไรก็ตามสิ่งที่คุณทำที่นี่ควรทำซ้ำได้ ที่ดีที่สุดคืออย่าเก็บสิ่งต่างๆไว้ที่นี่มิฉะนั้นคุณจะได้รับความทรงจำรั่วไหลหากคุณไม่ปล่อยสิ่งเหล่านี้เมื่อมุมมองหายไป

ดู: https://developer.apple.com/documentation/uikit/uiviewcontroller


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

1
ฉันไม่แน่ใจว่าฉันเห็นด้วยกับความคิดเห็นเกี่ยวกับ ivars ตัวควบคุมมุมมองเสมอหรือไม่และจะปล่อยให้คุณโดยอัตโนมัติ (ตัวควบคุมไม่ได้เปิดตัว) ฉันสงสัยว่าเราทั้งคู่สามารถสร้าง viewDidLoad ได้อย่างง่ายดายซึ่งอาจรั่วไหลหากถูกเรียกใช้ใหม่หลังจากไฟล์didReceiveMemoryWarning. แต่ฉันยอมรับว่าหากคุณใช้แนวทางปฏิบัติที่ดีในการเขียนหนังสือของviewDidLoadคุณคุณก็จะสบายดี ประเด็นเดียวของฉันคือการใช้ ivars และการจัดการหน่วยความจำแบบแมนนวลอย่างเลอะเทอะอาจทำให้เกิดการรั่วไหลในviewDidLoadไฟล์. ผู้คนควรมีความอ่อนไหวต่อdidReceiveMemoryWarningสถานการณ์และโปรแกรมตามนั้น
Rob

2
เพื่อไม่ให้เหยียดหยามจุด แต่น้อยกว่า 24 ชั่วโมงหลังจากการแลกเปลี่ยนนี้ในขณะที่ตอบคำถามอื่นผมพบว่าตัวอย่างของการได้อย่างแม่นยำการจัดเรียงของที่รหัสที่จะรั่วไหลเมื่อviewDidLoad didReceiveMemoryWarningเฮ้อ.
Rob

1
คำตอบนี้ขัดแย้งโดยตรงกับอีกข้อหนึ่ง: stackoverflow.com/a/3411636/269753ฉันสังเกตเมธอด viewDidLoad ของฉันที่ถูกเรียกมากกว่าหนึ่งครั้งแม้ว่าจะไม่ได้รับคำเตือนเกี่ยวกับหน่วยความจำเลยก็ตาม ใคร ๆ ก็อยากชี้แจง?
Ricardo Sanchez-Saez

2
ฉันไม่เห็นว่ามีความขัดแย้ง คำถามนั้นเกี่ยวกับความสัมพันธ์ระหว่าง viewDidLoad และ viewDidUnload ไม่ใช่ viewDidAppear
davidgoli

21

พูดง่ายๆก็คือคุณต้องการสร้างคอนโทรลหรืออาร์เรย์ใด ๆviewDidLoadในviewDidAppearที่ที่คุณต้องการรีเฟรชคอนโทรลหรืออาร์เรย์เหล่านั้น

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


3
ย่อหน้าแรกเป็นคำแนะนำที่ดี แต่วรรคสองไม่ถูกต้อง viewDidLoadอาจจะเรียกว่ามากกว่าหนึ่งครั้ง หากมุมมองของคุณในขณะที่ไม่แสดง (ภายใต้สแต็กของมุมมองอื่น ๆ ) ถูกยกเลิกการโหลดโดย iOS เวอร์ชันเก่าในสถานการณ์หน่วยความจำเหลือน้อยตัวควบคุมมุมมองจะโหลดมุมมองใหม่โดยอัตโนมัติเมื่อจำเป็นต้องแสดงใหม่บนหน้าจอ ใน iOS เวอร์ชันที่ใหม่กว่าคุณอาจเลือกที่จะช่วยลดการใช้หน่วยความจำโดยทำสิ่งที่ iOS รุ่นก่อนหน้าทำเพื่อคุณ: ยกเลิกการโหลดมุมมองนอกหน้าจอเมื่อdidReceiveMemoryWarningข้อความมาถึงซึ่งในกรณีนี้ระบบviewDidLoadจะเรียกอีกครั้ง
Basil Bourque

@WrightsCS คุณมีเอกสารอย่างเป็นทางการของ Apple ที่ระบุว่า? "viewDidLoad ถูกเรียกหนึ่งครั้งเมื่อสร้างคอนโทรลเลอร์" เนื่องจากฉันจำได้ว่าใน viewDidLoad ที่ผ่านมาสามารถเรียกได้หลายครั้งภายใต้สถานการณ์ที่มีหน่วยความจำเหลือน้อย ขอบคุณมาก.
Ricardo

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