DidMoveToParentViewController และ willMoveToParentViewController

เอกสาร Apple บน UIViewController พูดว่า:

หากคุณกำลังใช้ตัวควบคุมมุมมองคอนเทนเนอร์ของคุณเอง จะต้องเรียกใช้เมธอด willMoveToParentViewController: ของตัวควบคุมมุมมองลูกก่อนที่จะเรียกใช้เมธอด removeFromParentViewController โดยส่งผ่านค่าพาเรนต์เป็น nil

เมื่อคอนเทนเนอร์แบบกำหนดเองของคุณเรียกใช้เมธอด addChildViewController: มันจะเรียกเมธอด willMoveToParentViewController: ของตัวควบคุมมุมมองโดยอัตโนมัติเพื่อเพิ่มเป็นรายการลูกก่อนที่จะเพิ่ม

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

เมธอด removeFromParentViewController จะเรียกเมธอด didMoveToParentViewController: ของตัวควบคุมมุมมองลูกโดยอัตโนมัติหลังจากที่ลบลูกออก

เหตุใดฉันจึงควรเรียกวิธีการเหล่านี้ วิธีการเหล่านั้นมีไว้ทำอะไร?

ProfileViewController *profile = [[ProfileViewController alloc] init];
profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:profile];
[self.view addSubview:profile.view];
[profile didMoveToParentViewController:self];

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

ขอบคุณล่วงหน้า


person Arun    schedule 20.08.2015    source แหล่งที่มา
comment
วิธีการเหล่านี้ใช้สำหรับบางสถานการณ์เท่านั้น หลังจาก/ก่อนที่คุณจะย้าย/ลบ viewcontroller ไปยัง/จาก viewcontroller ถ้าจะเพิ่ม/ดัน/ลบ/ป๊อป ก็ไม่ต้องเรียกมัน   -  person tuledev    schedule 20.08.2015
comment
การลบวิธีการเหล่านั้นไม่แสดงการเปลี่ยนแปลงใดๆ เช่นเดียวกับการเพิ่มพวกเขาด้วย   -  person Arun    schedule 20.08.2015
comment
ใช่. มันถูก. วิธีการนี้ไม่ได้ทำอะไรเลย เพียงแค่เรียกใช้เมธอด DidMoveToParentViewController หากคุณไม่ดำเนินการให้เรียกมันว่า -> ไม่ต้องทำอะไรเลย   -  person tuledev    schedule 20.08.2015
comment
มันจะทำอะไรเพื่อการจัดการหน่วยความจำหรือไม่?   -  person Arun    schedule 20.08.2015
comment
ไม่. คุณสามารถเพิกเฉยได้   -  person tuledev    schedule 20.08.2015
comment
ดังนั้นจะมีประโยชน์อะไรที่จะใช้สิ่งเหล่านี้หากไม่มีผลกระทบและอาจถูกเพิกเฉยได้?   -  person Darius Miliauskas    schedule 01.12.2015


คำตอบ (2)


วิธีการเหล่านี้ถูกนำมาใช้เนื่องจากเป็นกฎที่ต้องปฏิบัติตามเมื่อเพิ่มหรือลบตัวควบคุมมุมมองลูก ก่อนที่จะเพิ่มตัวควบคุมมุมมองลูก ควรเรียกเมธอด willMoveToParentViewController ก่อนแล้วตามด้วยเมธอด didMoveToParentViewController ในขณะที่ลบตัวควบคุมมุมมองลูกออกจากตัวควบคุมมุมมองพาเรนต์ วิธีการเหล่านี้จะถูกเรียกในลำดับย้อนกลับ

addChildViewController: โทรโดยอัตโนมัติ [child willMoveToParentViewController:self] ดังนั้นเราควรโทร didMoveToParentViewController หลัง addChildViewController: ในทำนองเดียวกัน removeFromParentViewController: จะโทร [child didMoveToParentViewController:nil] โดยอัตโนมัติ ดังนั้นควรโทร willMoveToParentViewController: ก่อน removeFromParentViewController:

person Arun    schedule 24.08.2015

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

person Darius Miliauskas    schedule 01.12.2015