iOS Nested View Controllers ดูภายในมุมมองของ UIViewController หรือไม่


91

โดยทั่วไปแล้วการเขียนโปรแกรมที่ไม่ดีใน iOS จะมีมุมมองของตัวควบคุมมุมมองที่ซ้อนกันอยู่ในมุมมองของ UIViewController หรือไม่? ตัวอย่างเช่นฉันต้องการมีองค์ประกอบโต้ตอบบางอย่างที่ตอบสนองต่อการสัมผัสของผู้ใช้ แต่ใช้เวลาเพียง 25% ของหน้าจอ

ฉันคิดว่าฉันจะเพิ่มตัวควบคุมมุมมองที่ซ้อนกันนี้ไปยัง UIViewController ของฉันโดยพูดว่า:

[self.view addSubview: nestedViewController.view];

6
นี่คือบทช่วยสอนเต็มรูปแบบพร้อมรูปภาพมากมาย !! stackoverflow.com/a/23403979/294884 Enjoy
Fattie

คำตอบ:


148

ไม่นี่เป็นการออกแบบที่ดีโดยทั่วไปช่วยให้ตัวควบคุมมุมมองของคุณกระชับ อย่างไรก็ตามคุณควรใช้รูปแบบการควบคุมมุมมองโปรดดูเอกสารประกอบต่อไปนี้

การติดตั้ง Container View Controller

นี่เป็นเรื่องง่ายอย่างเหลือเชื่อในการตั้งค่าโดยใช้ตัวสร้างส่วนต่อประสานกับสตอรี่บอร์ดเช่นกันดูที่มุมมองคอนเทนเนอร์ในไลบรารีวัตถุ

นี่คือตัวอย่างที่สร้างขึ้นใน Storyboard ในตัวอย่างนี้คุณจะมีตัวควบคุมมุมมอง 4 ตัวตัวควบคุมหนึ่งตัวเก็บคอนเทนเนอร์ 3 ตัวและอีกตัวสำหรับคอนเทนเนอร์แต่ละตัว เมื่อคุณนำเสนอตัวควบคุมด้านซ้ายสุดที่มีคอนเทนเนอร์ทั้งหมด Storyboard จะเริ่มต้นและฝังอีก 3 โดยอัตโนมัติคุณสามารถเข้าถึงตัวควบคุมมุมมองเด็กเหล่านี้ผ่านchildViewControllersคุณสมบัติหรือมีวิธีการที่คุณสามารถแทนที่prepareForSegue:sender:และจับตัวควบคุมมุมมองปลายทางของ กำลังจะถูกเรียกตัวต่อ นี่เป็นจุดที่ดีในการส่งผ่านคุณสมบัติไปยังตัวควบคุมมุมมองเด็กหากจำเป็น

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


42
"นรก" ทำแบบนั้นในสตอรี่บอร์ดได้อย่างไร?! มันเป็นคำถามพื้นฐาน .. ฉันไม่รู้คำตอบ :) เฮ้อ - ตอบคำถามของตัวเอง เพิ่มคอนเทนเนอร์ในฉาก รูปร่างมัน จากนั้นในช่องว่างของสตอรีบอร์ดให้สร้าง UIViewController จากนั้นคลิกขวา - ลากจากคอนเทนเนอร์นั้น (ในรายการ Navigator หรือ GUI) ไปยัง UIViewController ใหม่นั้น จากป๊อปอัปให้เลือก viewDidLoad-embed เพื่อเริ่มต้น ขอบคุณคริส! :)
Fattie

ลิงก์เสียระหว่างทาง
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Holy cow: ใครจะไปเดาได้!
Drux

ขอบคุณ @ChrisWagner! นี่เป็นปริศนาที่สำคัญสำหรับการใช้สถาปัตยกรรม MVVM และหลีกเลี่ยงตัวควบคุมมุมมองขนาดใหญ่ / "MVC";)
Rob

54

ฉันใส่รหัสนี้ในตัวควบคุมมุมมองหลัก มันใช้งานได้ดีสำหรับฉัน

Obj C.

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

รวดเร็ว :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

อีกทางเลือกหนึ่งคือใช้ IB และใส่มุมมองคอนเทนเนอร์ UIViewController จะแสดงขึ้นโดยอัตโนมัติ (XCode 9 ในกรณีนี้): ป้อนคำอธิบายภาพที่นี่


2
ใช่ +1. ขอบคุณที่รวมคำตอบสำหรับวิธีทำแบบเป็นโปรแกรม :)
C.Tewalt

ฉันเพิ่งลากและวางมุมมองจากตัวควบคุมมุมมองเด็กไปยังรายการมุมมองย่อยของผู้ปกครอง
dimpiax

5

นี่คือโซลูชัน Swift 3 ของฉันตามคำตอบของ Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.