ฉันเพิ่งจุ่มเท้าของฉันเป็นครั้งแรกในการพัฒนา iOS และหนึ่งในสิ่งแรกที่ฉันต้องทำคือใช้ตัวควบคุมมุมมองคอนเทนเนอร์แบบกำหนดเอง - เรียกได้SideBarViewController
ว่าเปลี่ยนจากตัวควบคุมมุมมองเด็กที่เป็นไปได้หลายตัว แสดงเกือบจะเหมือนกับTab Bar Controllerมาตรฐาน (มันค่อนข้างเป็นTab Bar Controllerแต่มีเมนูด้านข้างที่ซ่อนได้แทนที่จะเป็นแถบแท็บ)
ตามคำแนะนำในเอกสารของ Apple ฉันโทรหาaddChildViewController
ทุกครั้งที่ฉันเพิ่ม ViewController ลูกลงในคอนเทนเนอร์ของฉัน รหัสของฉันสำหรับการสลับตัวควบคุมมุมมองเด็กปัจจุบันที่แสดงโดยSideBarViewController
มีลักษณะดังนี้:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
จากนั้นฉันก็เริ่มพยายามหาว่าaddChildViewController
ที่นี่ทำอะไรและฉันก็รู้ว่าฉันไม่รู้ นอกจากการติดใหม่ViewController
ใน.childViewControllers
อาร์เรย์แล้วดูเหมือนว่าจะไม่มีผลกระทบใด ๆ การดำเนินการและช่องทางจากมุมมองของผู้ควบคุมเด็กไปยังตัวควบคุมเด็กที่ฉันตั้งไว้บนกระดานเรื่องราวยังคงทำงานได้ดีแม้ว่าฉันจะไม่เคยโทรเลยaddChildViewController
ก็ตามและฉันนึกไม่ออกว่าจะมีผลกระทบอะไรอีก
อันที่จริงถ้าฉันเขียนรหัสของฉันใหม่เพื่อไม่เรียกaddChildViewController
และมีลักษณะเช่นนี้แทน ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... จากนั้นแอพของฉันก็ยังทำงานได้อย่างสมบูรณ์เท่าที่ฉันบอกได้!
เอกสารของ Apple ไม่ได้ให้ความกระจ่างเกี่ยวกับสิ่งที่addChildViewController
ทำหรือทำไมเราถึงควรเรียกมันว่า ขอบเขตทั้งหมดของคำอธิบายที่เกี่ยวข้องว่าวิธีนี้ทำอะไรหรือทำไมจึงควรใช้ในส่วนของการUIViewController
อ้างอิงคลาสคือในปัจจุบัน:
เพิ่มตัวควบคุมมุมมองที่กำหนดเป็นลูก ... วิธีนี้มีไว้เพื่อเรียกใช้โดยการใช้งานตัวควบคุมมุมมองคอนเทนเนอร์ที่กำหนดเองเท่านั้น หากคุณลบล้างวิธีนี้คุณต้องเรียกใช้ super ในการใช้งานของคุณ
นอกจากนี้ยังมีย่อหน้านี้ก่อนหน้านี้ในหน้าเดียวกัน:
ตัวควบคุมมุมมองคอนเทนเนอร์ของคุณต้องเชื่อมโยงตัวควบคุมมุมมองเด็กกับตัวเองก่อนที่จะเพิ่มมุมมองรากของเด็กไปยังลำดับชั้นของมุมมอง สิ่งนี้ช่วยให้ iOS สามารถกำหนดเส้นทางเหตุการณ์ไปยังตัวควบคุมมุมมองเด็กได้อย่างถูกต้องและมุมมองที่ตัวควบคุมเหล่านั้นจัดการ ในทำนองเดียวกันหลังจากลบมุมมองรูทของเด็กออกจากลำดับชั้นมุมมองแล้วควรตัดการเชื่อมต่อตัวควบคุมมุมมองเด็กนั้นออกจากตัวเอง ในการสร้างหรือทำลายการเชื่อมโยงเหล่านี้คอนเทนเนอร์ของคุณจะเรียกใช้เมธอดเฉพาะที่กำหนดโดยคลาสพื้นฐาน เมธอดเหล่านี้ไม่ได้มีไว้สำหรับลูกค้าของคลาสคอนเทนเนอร์ของคุณ โดยจะใช้เฉพาะในการใช้งานคอนเทนเนอร์ของคุณเพื่อให้เป็นไปตามพฤติกรรมการกักกันที่คาดหวัง
นี่คือวิธีการสำคัญที่คุณอาจต้องโทร:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
แต่ไม่ได้ให้เบาะแสใด ๆ ว่า 'เหตุการณ์' หรือ 'พฤติกรรมการกักกันที่คาดหวัง' ที่กำลังพูดถึงคืออะไรหรือทำไม (หรือแม้กระทั่งเมื่อ) การเรียกวิธีการเหล่านี้ว่า 'จำเป็น'
ตัวอย่างของตัวควบคุมมุมมองคอนเทนเนอร์แบบกำหนดเองในส่วน "Custom Container View Controllers" ของเอกสาร Apple ทั้งหมดเรียกวิธีนี้ดังนั้นฉันคิดว่ามันมีจุดประสงค์ที่สำคัญบางอย่างนอกเหนือไปจากการเปิด ViewController ลูกลงบนอาร์เรย์ แต่ฉันคิดไม่ออก จุดประสงค์นั้นคืออะไร วิธีนี้ใช้ทำอะไรและทำไมฉันถึงเรียกมันว่า?