มุมมองที่กำหนดเองด้วย Storyboard


96

ในหน้าจอที่ซับซ้อน (View Controllers) ฉันใช้เพื่อแยกสิ่งทั้งหมดออกเป็นชิ้นเล็ก ๆ (ฉันเรียกว่าวิดเจ็ต) วิดเจ็ตเหล่านี้ประกอบด้วย a MyWidget.hและMyWidget.mไฟล์เป็นพื้นฐานMyWidget.xibโดยที่องค์ประกอบรูทคือ a UIViewและคลาส MyWidget คือเจ้าของไฟล์ของ UIView ในการเริ่มต้นของวิดเจ็ตนี้ฉันทำไฟล์loadNibNamed.

ใน View Controller ของฉันฉันทำ a [[MyWidget alloc] init]ซึ่งฉันเพิ่มในมุมมองหลักของ View's Controller เป็นมุมมองย่อย จนถึงขณะนี้ทำงานได้อย่างสมบูรณ์

ตอนนี้ฉันสงสัยว่าจะทำเช่นเดียวกันกับสตอรีบอร์ดได้อย่างไรเพราะฉันไม่สามารถเริ่มลากไปที่UIViewใดที่หนึ่งได้จริงๆฉันมักจะต้องเริ่มต้นด้วยสิ่งUIViewControllerที่ฉันไม่ต้องการ

หากไม่มีวิธีที่เป็นไปได้ในการทำ Storyboard ฉันจะทำแบบเดิมได้ไหมโดยใช้ Storyboard สำหรับหน้าจอหลักและส่วนต่างๆของฉันและใช้ไฟล์. xib แยกต่างหากเพื่อกำหนดมุมมองที่กำหนดเอง


คุณต้องการสร้างxibสำหรับตัวควบคุมมุมมองของคุณแยกกันไม่ใช่ในสตอรี่บอร์ดหรือไม่?
tipycalFlow

คุณพบวิธีแก้ปัญหานี้หรือไม่?
aryaxt

@aryaxt: ฉันใช้ส่วนผสมของ Storyboard และ xib สตอรี่บอร์ดสำหรับหน้าจอหลักและ xib ที่มีเพียง UIView เป็นรูทสำหรับมุมมองหรือวิดเจ็ตที่ซับซ้อน ดังนั้นจึงไม่ใช่คำตอบสำหรับคำถามเดิมของฉันจริงๆ (โดยใช้สตอรีบอร์ด) แต่โดยพื้นฐานแล้วจะทำแบบเดียวกับที่ฉันทำก่อนหน้านี้
znq

วันนี้ใช้แค่มุมมองคอนเทนเนอร์มันง่ายจริงๆ .. stackoverflow.com/questions/23399061/…
Fattie

คำตอบ:


189

การใส่วิดเจ็ต / มุมมองในไฟล์. xib แยกกันใช้งานได้และเหมาะสมโดยเฉพาะอย่างยิ่งหากคุณอาจต้องการอ้างอิงมุมมองเดียวกันนั้นจาก View Controllers หลายตัว

อย่างไรก็ตามบางครั้งคุณอาจต้องการดูมุมมอง / วิดเจ็ตเพิ่มเติมภายในกระดานเรื่องราวเดียวกันและเป็นไปได้ นี่คือวิธีที่คุณทำ:

  1. เลือกตัวควบคุมมุมมองของคุณใน IB (คลิกที่แถบสีดำด้านล่างมุมมอง) จากนั้นลาก UIView จาก Object Library ลงในแถบสีดำ:

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

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

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

  3. คุณสามารถเชื่อมต่อกับตัวควบคุมมุมมองของคุณเช่นเดียวกับที่คุณเชื่อมต่อกับมุมมองอื่น ๆ : ป้อนคำอธิบายภาพที่นี่

  4. มุมมองที่เพิ่มจะปรากฏในโครงร่างเอกสารของคุณและคุณสามารถเชื่อมโยงการดำเนินการและการอ้างอิงได้ด้วย

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


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

วิธีแก้ปัญหาแรกคือลากมุมมองจากแถบสีดำกลับไปที่มุมมองของตัวควบคุมมุมมองของคุณแก้ไขแล้วลากกลับเข้าไปในแถบสีดำเมื่อคุณทำเสร็จแล้ว นี่เป็นปัญหา แต่เชื่อถือได้

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

  1. ลาก UITableView จาก Object Library ไปยังมุมมองที่เพิ่มเข้ามาใหม่

  2. จากนั้นลาก UITableViewCell ลงใน UITableView นั้น

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

  3. เมื่อคุณทำเช่นนั้นมุมมองของคุณจะปรากฏออกมาด้านข้างอย่างน่าอัศจรรย์ แต่คุณมี UITableView ที่คุณไม่ต้องการ คุณสามารถปรับขนาดเป็น 0x0 หรือจะลบออกก็ได้และ UIView ของคุณจะยังคงปรากฏอยู่

  4. ในบางครั้งมุมมองรองจะถูกซ่อนอีกครั้งใน IB คุณสามารถทำขั้นตอนข้างต้นซ้ำได้หากคุณลบ UITableView หรือหาก UITableView ยังอยู่ในลำดับชั้นคุณเพียงแค่คลิกที่ UITableViewCell จากนั้นมุมมองจะปรากฏขึ้นอีกครั้ง

วิธีที่สองใช้ได้กับ UIViews แต่ไม่ค่อยดีสำหรับ UIToolbars และเป็นไปไม่ได้สำหรับ UIButtons ดังนั้นวิธีที่สะอาดที่สุดที่ฉันพบเมื่อคุณต้องการรวมมุมมองย่อยที่แตกต่างกันจำนวนมากคือการแนบ UIView รองเดียวกับตัวควบคุมมุมมองของคุณเป็นคอนเทนเนอร์ที่ ไม่เคยแสดงให้ใส่มุมมองรองทั้งหมดของคุณไว้ที่นั่นและใช้เคล็ดลับ UITableViewCell เพื่อทำให้ทุกอย่างมองเห็นได้ ฉันปรับขนาด UITableView จำลองของฉันเป็น 0x0 เพื่อให้มองไม่เห็น นี่คือภาพหน้าจอของลักษณะทั้งหมดร่วมกัน:

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


มีนาคม 2013 ฉันไม่จำเป็นต้องทำสิ่งนี้ - คุณควรเพิกเฉยต่อแถบสีดำอย่างสมบูรณ์และลาก / วางมุมมองของคุณลงในมุมมองหลักโดยตรงและใช้งานได้ดี (Xcode 4.5+)
อดัม

เป็นไปได้ไหมที่จะนำ uivew ที่กำหนดเองนั้นมาใช้ซ้ำบน ViewController เดียวกัน - ถ้าฉันเป็นเช่นนั้น ต้องการ uivew สองแบบที่กำหนดเอง - และถ้าเป็นอย่างไร
Morten Gustafsson

2
แดงฉันชอบสร้าง xib แยกต่างหาก ฉันคงจำทั้งหมดนี้ไม่ได้เมื่อต้องอัปเดตแอปใน 6 เดือน
แซนดี้

แม้ว่านี่จะเป็นคำตอบที่ยอดเยี่ยม แต่ฉันก็พบวิธีที่ดีกว่านี้โดยบังเอิญ เมื่อเชื่อมต่อร้านค้าเข้ากับส่วนประกอบมุมมองจริง หากคุณวางเมาส์เหนือส่วนประกอบของมุมมองด้านในดังกล่าวเล็กน้อยจะปรากฏขึ้นเพื่อให้เลือกได้ง่ายขึ้น แล้วคุณจะเห็นมันบนกระดานเรื่องราว ...
Oded Ben Dov

7
แม้ว่านี่จะเป็นคำตอบทางประวัติศาสตร์ที่น่าชื่นชมอย่างไม่น่าเชื่อ แต่ตอนนี้มันล้าสมัยไปแล้ว Apple แก้ไขปัญหาทั้งหมดด้วยการแนะนำ "มุมมองคอนเทนเนอร์" ซึ่งตอนนี้เป็นสิ่งพื้นฐานที่คุณทำเมื่อสร้างแอปทุกอย่างเป็น "มุมมองคอนเทนเนอร์" ตลอดเวลา ขอบคุณพระเจ้าตอนนี้ง่ายมาก!
Fattie

11

หากคุณแค่ต้องการสร้างตัวควบคุมมุมมองของคุณในที่อื่น (ไม่ใช่ในกระดานเรื่องราวของคุณ) มีวิธีง่ายๆในการทำสิ่งนี้:

1) สร้างCustomViewControllers ของคุณ( abcdControllerในรหัสที่ฉันพยายาม) ด้วยบุคคลของพวกเขาxibตามปกติ

2) เพิ่มUIViewController(หรืออะไรก็ได้ที่เป็นซูเปอร์คลาสของคุณCustomViewController) ในกระดานเรื่องราว

3) ตั้งค่า CustomClass เป็นCustomViewControllerแทนUIViewControllerดังที่แสดงไว้ที่นี่:

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

4) สุดท้ายในของคุณviewDidLoadโหลดแบบกำหนดเองxibและคุณทำเสร็จแล้ว

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

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

1
อืม ... ฉันคิดว่าฉันได้สิ่งที่คุณต้องการแล้ว โดยทั่วไปคุณต้องการจัดการหลายมุมมองด้วยคอนโทรลเลอร์เดียวกันใช่ไหม? ฉันคิดวิธีอื่นไม่ได้นอกจากloadNibNamedในกรณีนั้น ... XO
tipycalFlow

สิ่งนี้ช่วยแก้ปัญหานี้ให้ฉัน: stackoverflow.com/questions/11047991/… อย่างไรก็ตามแทนที่จะใช้ viewDidLoad ฉันใช้ loadView ...
Morkrom

1
ขอย้ำว่าทั้งหมดนี้ (ขอบคุณพระเจ้า!) ล้าสมัยไปแล้วโดยสิ้นเชิงที่มุมมองคอนเทนเนอร์อยู่ที่นี่ เพียงคลิกที่มุมมองคอนเทนเนอร์และเสร็จสิ้น
Fattie

1

ฉันคิดว่าคุณสามารถทำสิ่งนี้เพื่อรับอินสแตนซ์ของวิวคอนโทรลเลอร์เฉพาะจาก Storyboard และใช้มุมมองด้านบน

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

หวังว่านี่จะช่วยได้

ขอบคุณวีเจย์

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