ในขณะที่ตรวจสอบการรั่วไหลของหน่วยความจำฉันพบปัญหาที่เกี่ยวข้องกับเทคนิคการโทรsetRootViewController:
ภายในบล็อกภาพเคลื่อนไหวการเปลี่ยนแปลง:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
หากตัวควบคุมมุมมองเก่า (ตัวที่ถูกแทนที่) กำลังนำเสนอตัวควบคุมมุมมองอื่นอยู่รหัสด้านบนจะไม่ลบมุมมองที่นำเสนอออกจากลำดับชั้นของมุมมอง
นั่นคือลำดับของการดำเนินการนี้ ...
- X กลายเป็น Root View Controller
- X นำเสนอ Y เพื่อให้มุมมองของ Y ปรากฏบนหน้าจอ
- ใช้
transitionWithView:
เพื่อทำให้ Z เป็น Root View Controller ใหม่
... ดูเหมือนผู้ใช้จะตกลง แต่เครื่องมือลำดับชั้นของมุมมองดีบักจะเปิดเผยว่ามุมมองของ Y ยังคงมีอยู่เบื้องหลังมุมมองของ Z ภายใน a UITransitionView
. นั่นคือหลังจากสามขั้นตอนข้างต้นลำดับชั้นของมุมมองคือ:
- UIWindow
- UITransitionView
- UIView (มุมมองของ Y)
- UIView (มุมมองของ Z)
- UITransitionView
ฉันสงสัยว่านี่เป็นปัญหาเพราะในช่วงเวลาของการเปลี่ยนแปลงมุมมองของ X ไม่ได้เป็นส่วนหนึ่งของลำดับชั้นมุมมอง
ถ้าฉันส่งdismissViewControllerAnimated:NO
ไปที่ X ก่อนหน้าtransitionWithView:
ลำดับชั้นการดูผลลัพธ์คือ:
- UIWindow
- UIView (มุมมองของ X)
- UIView (มุมมองของ Z)
ถ้าฉันส่งdismissViewControllerAnimated:
(ใช่หรือไม่ใช่) ไปที่ X ให้ทำการเปลี่ยนในcompletion:
บล็อกจากนั้นลำดับชั้นของมุมมองจะถูกต้อง น่าเสียดายที่รบกวนการเคลื่อนไหว หากทำให้การเลิกจ้างเคลื่อนไหวทำให้เสียเวลา ถ้าไม่เคลื่อนไหวก็ดูเสีย
ฉันกำลังลองวิธีอื่น ๆ (เช่นสร้างคลาสคอนโทรลเลอร์มุมมองคอนเทนเนอร์ใหม่เพื่อใช้เป็นตัวควบคุมมุมมองรูทของฉัน) แต่ไม่พบสิ่งใดที่ใช้ได้ผล ฉันจะอัปเดตคำถามนี้เมื่อไป
เป้าหมายสูงสุดคือการเปลี่ยนจากมุมมองที่นำเสนอไปยังตัวควบคุมมุมมองรูทใหม่โดยตรงและโดยไม่ทิ้งลำดับชั้นมุมมองที่หลงทาง