เลือกไปที่สตอรีบอร์ดอื่นไหม


133

เป็นไปได้ไหมที่จะทำต่อจากสตอรีบอร์ดหนึ่งไปยังอีกบอร์ดหนึ่งหรือฝังสตอรีบอร์ดในตัวควบคุมมุมมองในสตอรีบอร์ดอื่น ฉันต้องการวางUITabBarControllerใน a UINavigationControllerและฉันต้องการให้มันดีและแยกจากกัน


1
ดูคำตอบนี้stackoverflow.com/a/19702425/317928
vokilam

5
คำถามที่ดี การมีสตอรีบอร์ดหนึ่งแผ่นถือเป็นฝันร้ายสำหรับโครงการที่ทำงานเป็นทีม เราแบ่งโปรเจ็กต์ออกเป็นสตอรีบอร์ดโดยใช้ "โฟลว์" เป็นประจำ (สตอรีบอร์ดสำหรับล็อกอินหนึ่งสตอรีบอร์ดสำหรับฟีดข่าวและหน้าจอที่เกี่ยวข้อง ฯลฯ ) ช่วยลดจำนวนข้อขัดแย้งในการผสานซึ่งอาจเกิดขึ้นทุกครั้งที่นักพัฒนาซอฟต์แวร์แตะกระดานเรื่องราว
Brian Sachetta

@BrianSachetta คุณทำอะไรอีก? มีเคล็ดลับที่ดีอื่น ๆ ที่จะแบ่งปันหรือไม่?
น้ำผึ้ง

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

คำตอบ:


202

ใช่ แต่คุณต้องทำแบบเป็นโปรแกรม:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
ฉันแค่อยากให้สตอรีบอร์ดแยกจากกัน มันรกเกินไปแล้ว
Ry-

11
เช่นเดียวกับบทต่างๆในหนังสือฉันเห็นว่าจำเป็นต้องมีสตอรีบอร์ดหลายชุด
finneycanhelp

48
เมื่อคุณมีนักพัฒนาหลายคนที่ทำงานบนแอปพลิเคชันเดียวกันการมีสตอรีบอร์ดหลายตัวจะมีประโยชน์มากเนื่องจากการแก้ไขข้อขัดแย้งในการควบคุมเวอร์ชันใน xml สตอรี่บอร์ดนั้นค่อนข้างเจ็บปวดในบางครั้ง
Lee

14
ใน iOS 9 และ Xcode 7 ตอนนี้รองรับการอ้างอิงแบบ cross-storyboard แล้ว :-)
Quinn Taylor

1
ดูคำตอบของ milczi คุณสามารถทำได้อย่างง่ายดายใน UI!
ทิม

119

ตั้งแต่ Xcode 7 เป็นต้นไปคุณสามารถทำกราฟิกได้โดยใช้ Storyboard Reference:

เอกสารอ้างอิง

เพิ่มการอ้างอิง Storyboard ในสตอรีบอร์ดของคุณ สร้างการต่อระหว่าง ViewController และ Storyboard Reference (ctrl + drag)

จากนั้นกรอกข้อมูลในช่องนี้

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

โดยที่ "Tutorial" คือไฟล์ "Tutorial.storyboard" และ "MainTutorialController" คือช่อง "Storyboard ID" ของคุณใน ViewControllerSettings


1
ข้อมูลที่ดีอย่างไรก็ตามคำถามถูกแท็ก ios5 ดังนั้นจึงใช้ไม่ได้
lnafziger

10
@Inafziger ใช่ แต่คำถามนี้ปรากฏที่ด้านบนของผลการค้นหาสำหรับผู้ที่ใช้ iOS 9
Brian Ogden

สามารถใช้ได้ตั้งแต่ XCode 7 เป็นต้นไป ดูข้อมูลเพิ่มเติมได้ที่stackoverflow.com/questions/30772145/…
Simon Pickup

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

สิ่งนี้ใช้ได้ผลสำหรับฉันใน iOS 10 ฉันทราบว่าฉันต้องการการอ้างอิงสตอรีบอร์ดหนึ่งรายการต่อหนึ่งต่อหนึ่งและไม่สามารถเชื่อมต่อหลาย ๆ ส่วนเข้ากับจุดอ้างอิงเดียวได้
Mark Reid

10

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

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

สิ่งหนึ่งที่ควรทราบก็คือคุณเคยบอกว่าคุณต้องการรักษาสิ่งต่างๆให้ดีและแยกจากกัน แนวคิดของสตอรีบอร์ดคือให้คุณแยกสิ่งต่างๆออกจากกันในขณะที่ทำงานออกแบบทั้งหมดในที่เดียว ตัวควบคุมมุมมองแต่ละตัวนั้นดีและแยกออกจากกระดานเรื่องราวภายในกระดานเรื่องราวอื่น ๆ แนวคิดทั้งหมดคือเก็บไว้ในที่เดียว เพียงแค่จัดวางอย่างสวยงามเพื่อให้เป็นระเบียบและคุณก็พร้อมที่จะไป คุณไม่ควรแยกมันออกไปเว้นแต่คุณจะมีเหตุผลที่ดีจริงๆที่จะทำเช่นนั้น


6
การรวมสตอรี่บอร์ดทำงานได้ไม่ดีนักดังนั้นในสภาพแวดล้อมที่มีผู้พัฒนาหลายคนการใช้สตอรีบอร์ดแยกกันจึงน่าสนใจ นอกจากนี้ประสิทธิภาพอาจแย่พอสมควรในโปรเจ็กต์ใหญ่ ๆ ด้วยสตอรี่บอร์ดเดียว
calimarkus

1
เราใช้สตอรี่บอร์ดหลายชิ้น แต่ประเด็นก็คือคุณไม่สามารถทำเช่นนั้นและต่อเนื่องกันได้ Apple ออกแบบมาเพื่อให้คุณสามารถทำทุกอย่างได้ในที่เดียวดังนั้นแนวคิดจึงเป็นการใช้เพียงอย่างเดียว (ไม่ใช่ว่าคุณทำไม่ได้) ประสิทธิภาพไม่ควรเป็นปัญหา สตอรี่บอร์ดถูกรวบรวมเป็นไฟล์หัวปากกาแยกกันสำหรับตัวควบคุมมุมมองแต่ละตัว คุณควรได้รับประสิทธิภาพที่ดีมากจากสตอรีบอร์ด ประสิทธิภาพจะดีพอ ๆ กับที่คุณมี xibs แยกต่างหากสำหรับตัวควบคุมมุมมองทุกตัว
wbyoung

3
ในกรณีของฉันปัญหาด้านประสิทธิภาพมักจะอยู่ใน Xcode ... การใช้งานตัวแก้ไขสตอรี่บอร์ดของ Apple ในปัจจุบันนั้นอ่อนแอ
อดัม

1
Storyboard 60 ฉากใช้เวลา 13 วินาทีในการเปิดบน Mac Pro ปี 2014 ฉันได้ยื่นเรดาร์
Robert Atkins

7

คุณไม่ควรวาง UITabBarControllers ใน UINavigationController กำลังขอจุดบกพร่องเช่นการหมุนอัตโนมัติ / ดูการยกเลิกการโหลดที่ไม่ถูกต้องเป็นต้นเนื่องจาก Apple ไม่รองรับการกักกันประเภทนี้:

อย่างไรก็ตามเมื่อรวมตัวควบคุมมุมมองลำดับของการกักกันมีความสำคัญ การเตรียมการบางอย่างเท่านั้นที่ถูกต้อง ลำดับการกักกันจากเด็กไปยังผู้ปกครองมีดังนี้:

  • ตัวควบคุมมุมมองเนื้อหาและตัวควบคุมมุมมองคอนเทนเนอร์ที่มีขอบเขตที่ยืดหยุ่น (เช่นตัวควบคุมมุมมองหน้า)
  • ตัวควบคุมมุมมองการนำทาง
  • ตัวควบคุมแถบแท็บ
  • ตัวควบคุมมุมมองแยก

1
ฉันเห็นด้วยโดยสิ้นเชิงและด้วยเหตุผลหลายประการ การวาง TabBarController ไว้ใน NavigationController ไม่ใช่ความคิดที่ดีเนื่องจากผู้รับมอบสิทธิ์จะเริ่มการทำงานไม่ถูกต้องสำหรับมุมมองที่มีอยู่ภายในและผู้ใช้ปลายทางจะมีช่วงเวลาที่เลวร้ายในการสำรวจอินเทอร์เฟซ พวกเขาจะมีปัญหาในการกลับไปที่คอนโทรลเลอร์ที่นำออกจากอินเทอร์เฟซ TabBar / Navigation ในทางกลับกันก็โอเค NavigationController ภายใน TabBarController เป็นการดีที่สุดเสมอที่จะไม่สร้างความสับสนให้กับผู้ใช้ปลายทางและรับฟังคำแนะนำของ Apples!
Hubert Kunnemeyer

1
แต่แอพ iPhone Music ดั้งเดิมก็ทำเช่นนั้น (ส่วน "กำลังเล่น")
Enzo Tran

FYI: แอพเพลงของ iPhone ไม่มี TabbarController ในหน้าจอ "กำลังเล่น"
sanjana

4

นี่คือเวอร์ชันที่รวดเร็ว:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

คุณลองทำสิ่งต่อไปนี้หรือไม่:

2 / คลิกเพื่อเลือกตัวควบคุมมุมมองของคุณซึ่งเชื่อมโยงกับตัวควบคุมการนำทางของคุณและในเมนูด้านบน: ตัวแก้ไข -> ฝังใน -> ตัวควบคุมแถบแท็บ

หมายเหตุ: ฉันไม่ได้ทดสอบเพราะฉันใช้สิ่งที่ตรงกันข้าม: สร้างแอพแถบแบบแท็บและวางตัวควบคุมการนำทางไว้ข้างใน)

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