UIViewController viewDidLoad เทียบกับ viewWillAppear: การแบ่งงานที่เหมาะสมคืออะไร?


164

ฉันมีความไม่ชัดเจนอยู่เสมอเกี่ยวกับประเภทของงานที่ควรกำหนดให้viewDidLoadกับ vs. viewWillAppear: ในUIViewControllerคลาสย่อย

เช่นฉันกำลังทำแอพที่ฉันมีUIViewControllersubclass กดปุ่มเซิร์ฟเวอร์รับข้อมูลป้อนไปยังมุมมองแล้วแสดงมุมมองนั้น อะไรคือข้อดีข้อเสียของการทำเช่นนี้viewDidLoadกับviewWillAppear?

คำตอบ:


251

viewDidLoad เป็นสิ่งที่คุณต้องทำครั้งเดียว เรียกใช้ viewWillAppear ทุกครั้งที่มีการดู คุณควรทำสิ่งต่าง ๆ ที่คุณต้องทำเพียงครั้งเดียวใน viewDidLoad - เช่นการตั้งค่าข้อความ UILabel ของคุณ อย่างไรก็ตามคุณอาจต้องการแก้ไขบางส่วนของมุมมองทุกครั้งที่ผู้ใช้สามารถดูได้เช่นแอปพลิเคชัน iPod จะเลื่อนเนื้อเพลงกลับไปด้านบนทุกครั้งที่คุณไปที่มุมมอง "กำลังเล่น"

อย่างไรก็ตามเมื่อคุณโหลดสิ่งต่าง ๆ จากเซิร์ฟเวอร์คุณต้องคำนึงถึงความล่าช้าด้วย หากคุณบรรจุการสื่อสารเครือข่ายของคุณทั้งหมดลงใน viewDidLoad หรือ viewWillAppear พวกเขาจะถูกดำเนินการก่อนที่ผู้ใช้จะเห็นมุมมอง - อาจทำให้แอปของคุณหยุดชะงัก มันเป็นความคิดที่ดีที่จะแสดงมุมมองที่ไม่มีผู้คนอาศัยอยู่ด้วยตัวบ่งชี้กิจกรรมในบางประเภท เมื่อคุณทำกับเครือข่ายของคุณซึ่งอาจใช้เวลาหนึ่งหรือสองวินาที (หรืออาจล้มเหลว - ใครจะรู้?) คุณสามารถเติมมุมมองด้วยข้อมูลของคุณ ตัวอย่างที่ดีเกี่ยวกับวิธีการทำสิ่งนี้สามารถเห็นได้ในไคลเอนต์ทวิตเตอร์ต่างๆ ตัวอย่างเช่นเมื่อคุณดูหน้ารายละเอียดผู้แต่งใน Twitterrific มุมมองจะบอกว่า "กำลังโหลด ... " เท่านั้นจนกว่าเคียวรีเครือข่ายจะเสร็จสิ้น


ดังนั้นเกี่ยวกับ viewWillAppear อาจถูกเรียกซ้ำ ๆ วิธีการนั้นจะเริ่มทำงานหรือไม่ตัวอย่างเช่นมุมมองตัวควบคุมที่มองเห็นได้จะปรากฏขึ้นหลังจากถูกซ่อนไว้ (ฉันหมายถึงถูกบดบังที่นี่ไม่ใช่วิธีที่ซ่อนอยู่ใน UIView) scenerio ใดที่จะเรียกดู WillAppear โดยไม่ต้องมีการเรียกไปยัง viewDidLoad ก่อนหน้า
dugla

7
viewDidLoad จะได้รับการเรียกเท่านั้นเมื่อสร้างมุมมอง - ตัวอย่างเช่นหลังจากตัวควบคุมมุมมองเริ่มต้นการเรียก callFromNibNamed เมื่อเข้าถึงมุมมอง viewWillAppear ถูกเรียกเมื่อใดก็ได้ที่คอนโทรลเลอร์มุมมองของคุณไม่ได้อยู่ในมุมมอง แต่เข้ามาในมุมมองดังนั้นเมื่อมีการพุชตัวควบคุมมุมมองของคุณ viewWillAppear จะถูกเรียกใช้ ถ้าคุณดันมุมมองย่อยอีกอันจากนั้นและผู้ใช้กลับมา viewWillAppear จะถูกเรียกอีกครั้ง
Kendall Helmstetter Gelner

ขอบคุณเคนดัลล์ ย่ะ NSLogs ที่วางกลยุทธ์บางอย่างให้ฉันจัดเรียง viewWillAppear / viewWillDissupear ปรากฏขึ้นที่ push view / pops
dugla

3
โปรดทราบว่า viewDidLoad จะยังได้รับการเรียกถ้ามุมมองถูกซ่อนไว้และจากนั้นยกเลิกการโหลดด้วยเหตุผลที่เกี่ยวข้องกับหน่วยความจำแล้วปรากฏขึ้นอีกครั้ง สิ่งที่คุณวางใจได้: viewDidLoad จะถูกเรียกว่าอย่างน้อยครั้งเดียวเมื่อมุมมองถูกสร้างขึ้นเป็นครั้งแรกและ POSSIBLY อีกครั้งเมื่อมุมมองปรากฏขึ้นอีกครั้งหลังจากที่ถูกซ่อนไว้ viewWillAppear จะถูกเรียกตลอดเวลาเมื่อมุมมองใกล้จะปรากฏบนหน้าจอ
DanM

2
ใครบางคนโปรดแสดงความคิดเห็นเพิ่มเติมเกี่ยวกับคำถามที่เกี่ยวข้องสองข้อนี้: (1) บางครั้งไม่เสมอไปค่าเฟรมสำหรับการควบคุม (เช่นต้นกำเนิดและขนาด) เป็นศูนย์ใน viewDidLoad และบางครั้งไม่ - ทำไม (2) ในเทมเพลตของ Apple สำหรับ detailView ของ SplitViewController (iPad) มีวิธีกำหนดค่าของวิววิว - สิ่งใดบ้างที่ควรเกี่ยวข้องกับ viewDidLoad และ ViewWillAppear
เจฟฟ์

12

เริ่มต้นใช้เฉพาะ ViewDidLoad พร้อม tableView ในการทดสอบกับการสูญเสีย Wifi โดยการตั้งค่าอุปกรณ์เป็นโหมดเครื่องบินตระหนักว่าตารางไม่รีเฟรชพร้อมคืน Wifi อันที่จริงดูเหมือนว่าจะไม่มีวิธีในการรีเฟรช tableView บนอุปกรณ์แม้โดยการกดปุ่มโฮมด้วยการตั้งค่าโหมดพื้นหลังเป็น YES ใน -Info.plist

ทางออกของฉัน:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

สิ่งสำคัญที่ควรทราบคือการใช้ viewDidLoad สำหรับการจัดตำแหน่งนั้นมีความเสี่ยงเล็กน้อยและควรหลีกเลี่ยงเนื่องจากไม่ได้กำหนดขอบเขต สิ่งนี้อาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด (ฉันมีปัญหาหลายอย่าง ... )

โพสต์นี้อธิบายถึงวิธีการที่แตกต่างกันค่อนข้างดีและสิ่งที่เกิดขึ้นในแต่ละวิธี

ปัจจุบันสำหรับ init และการวางตำแหน่งแบบครั้งเดียวฉันกำลังคิดที่จะใช้ viewDidAppear พร้อมการตั้งค่าสถานะหากใครมีคำแนะนำอื่นใดโปรดแจ้งให้เราทราบ


เห็นด้วยกับเรื่องนี้: "... ควรหลีกเลี่ยงเนื่องจากไม่ได้กำหนดขอบเขต ... "
danisupr4

4

ขึ้นอยู่กับว่าคุณต้องการโหลดข้อมูลทุกครั้งที่คุณเปิดมุมมองหรือไม่? หรือเพียงครั้งเดียว ?

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

  • แดง:พวกเขาไม่ต้องการเปลี่ยนแปลงทุกครั้ง เมื่อพวกเขาโหลดพวกเขาจะยังคงเป็นเหมือนเดิม
  • สีม่วง:พวกเขาต้องเปลี่ยนเมื่อเวลาผ่านไปหรือหลังจากที่คุณโหลดในแต่ละครั้ง คุณไม่ต้องการเห็นผู้ใช้ 3 คนที่แนะนำให้ติดตาม แต่จะต้องมีการโหลดซ้ำทุกครั้งที่คุณกลับมาที่หน้าจอ รูปภาพของพวกเขาอาจได้รับการอัปเดต ... คุณไม่ต้องการดูรูปภาพเมื่อ 5 ปีที่แล้ว ...

viewDidLoad: การประมวลผลใดก็ตามที่คุณต้องทำครั้งเดียว
viewWilLAppear:การประมวลผลใด ๆ ที่จำเป็นต้องเปลี่ยนทุกครั้งที่โหลดหน้าเว็บ

ป้ายกำกับไอคอนชื่อปุ่มหรือ dataInputedByDeveloper ส่วนใหญ่จะไม่เปลี่ยนแปลง ชื่อ, ภาพถ่าย, ลิงค์, สถานะของปุ่ม, รายการ (อินพุตอาร์เรย์สำหรับ tableViews หรือ collectionView ของคุณ) หรือ dataInputedByUser ส่วนใหญ่มักจะเปลี่ยนแปลง


สีม่วงจะถูกเรียกในมุมมองไม่ปรากฏในมุมมอง WillAppear
Alex Kornhauser

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