다른 스토리 보드를 찾으십니까?


133

한 스토리 보드에서 다른 스토리 보드로 연결하거나 스토리 보드를 다른 스토리 보드의 뷰 컨트롤러에 포함시킬 수 있습니까? 나는 배치해야 UITabBarControllerA의 UINavigationController, 나는 그들을 좋은 유지하고 분리하고 싶습니다.


1
이 답변을보십시오 stackoverflow.com/a/19702425/317928
vokilam

5
좋은 질문입니다. 하나의 스토리 보드를 갖는 것은 팀 기반 프로젝트의 악몽입니다. 우리는 정기적으로 "흐름"(로그인 용 스토리 보드, 뉴스 피드 용 스토리 보드 및 관련 화면 등)을 통해 스토리 보드로 프로젝트를 분할합니다. 이는 개발자가 스토리 보드를 터치 할 때마다 발생하는 병합 충돌 수를 최소화하는 데 도움이됩니다.
Brian Sachetta

@BrianSachetta 다른 무엇을하세요? 공유 할 다른 유용한 팁이 있습니까?
Honey

팀 구조에 따라 다릅니다. 정말로 원한다면 모든 사용자 인터페이스를 별도의 .xib 파일로 만들 수 있습니다. 스토리 보드가 존재하기 이전의 방식입니다. 이 접근법에는 장점과 단점이 있습니다. 단점은 프로젝트에서 다른 개발자와 충돌이 거의 없다는 것입니다. 단점은 앱 흐름을 시각적으로보기가 어려울 수 있다는 것입니다.
Brian Sachetta

답변:


201

예, 그러나 프로그래밍 방식으로해야합니다.

// 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에서 이제 크로스 스토리 보드 참조가 지원됩니다. :-)
Quinn Taylor

1
milczi의 답변을 참조하십시오. 이제 UI에서 매우 쉽게 할 수 있습니다!
Tim

117

Xcode 7부터 Storyboard Reference를 사용하여 그래픽으로 수행 할 수 있습니다.

참고

스토리 보드에 스토리 보드 참조를 추가하십시오. ViewController와 Storyboard Reference 사이에 segue 생성 (ctrl + 드래그)

그런 다음이 필드를 채우십시오.

여기에 이미지 설명을 입력하십시오

여기서 "Tutorial"은 "Tutorial.storyboard"파일이고 "MainTutorialController"는 ViewControllerSettings의 "Storyboard ID"필드입니다.


1
좋은 정보이지만 질문에 ios5 태그가 지정되어 있으므로 적용되지 않습니다.
lnafziger

10
@Inafziger 예.하지만이 질문은 iOS 9를 사용하는 사람들의 검색 결과 상단에 나타납니다
Brian Ogden

이것은 XCode 7부터 사용할 수 있습니다. stackoverflow.com/questions/30772145/…
Simon Pickup

이것은 효과가 있었지만 탐색 모음을 유지해야합니다. 탐색 모음없이 표시됩니다. 탐색과 버튼을 계속 사용하여 기록으로 다시 이동할 수있는 방법이 있습니까? 어떤 스토리 보드에서 왔습니까?
길 Beyruth

이것은 iOS 10에서 저에게 효과적입니다. 나는 segue 당 하나의 스토리 보드 참조가 필요하고 여러 segue를 하나의 참조 지점에 연결할 수 없다는 것을 알았습니다.
Mark Reid

10

UIStoryboardSegue는 추상 클래스이므로 실제로 수동으로 segue를 수행 할 수 없습니다. perform무엇이든하기 위해서는 서브 클래 싱하고 구현 해야합니다. 그것들은 실제로 스토리 보드에서 만들어 져야합니다. 그러나보기 컨트롤러를 수동으로 푸시 할 수 있지만 이는 좋은 솔루션입니다. lnafziger의 대답은 이것을 잘 수행합니다.

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

하지만 한 가지 주목할 점은 사물을 멋지게 분리하고 싶다고 말한 것입니다. 스토리 보드의 개념은 모든 디자인 작업을 한 곳에서 수행하면서 작업을 분리 할 수 ​​있도록하는 것입니다. 각 뷰 컨트롤러는 훌륭하고 스토리 보드 내에서 다른 보드와 분리되어 있습니다. 모든 아이디어를 한 곳에 보관하는 것이 좋습니다. 잘 정리해서 정리하면 좋을 것입니다. 그렇게해야 할 이유가 없다면 분리하지 마십시오.


6
스토리 보드 병합은 잘 작동하지 않으므로 다중 개발자 환경에서는 별도의 스토리 보드를 사용하는 것이 흥미로울 수 있습니다. 또한 스토리 보드가 하나 인 대규모 프로젝트에서는 성능이 상당히 떨어질 수 있습니다.
calimarkus

1
우리는 여러 개의 스토리 보드를 사용하지만 요점은 실제로 그렇게 할 수 없으며 그 사이를 헤매는 것입니다. Apple은 한 곳에서 모든 작업을 수행 할 수 있도록 설계했기 때문에 아이디어는 한 곳만 사용하는 것이 좋습니다 (할 수없는 것은 아님). 성능에 문제가 없어야합니다. 스토리 보드는 각보기 컨트롤러마다 별도의 nib 파일로 컴파일됩니다. 스토리 보드에서 성능이 좋아야합니다. 모든 뷰 컨트롤러마다 별도의 xib가있는 것처럼 성능이 향상됩니다.
wbyoung

3
필자의 경우 성능 문제는 일반적으로 Xcode에 있습니다 ... 스토리 보드 편집기의 Apple의 현재 구현은 약합니다.
Adam

1
60 장짜리 스토리 보드는 2014 Mac Pro에서 열려면 13 초가 걸립니다. 레이더를 제출했습니다.
Robert Atkins

7

UITabBarControllers를 UINavigationController에 배치해서는 안됩니다. Apple 이러한 종류의 봉쇄를 지원하지 않으므로 잘못된 자동 회전 /보기 언로드 등과 같은 버그를 요청합니다 .

그러나 뷰 컨트롤러를 결합 할 때는 격리 순서가 중요합니다. 특정 계약 만 유효합니다. 아동에서 부모까지의 격리 순서는 다음과 같습니다.

  • 컨텐츠 뷰 컨트롤러 및 유연한 경계를 가진 컨테이너 뷰 컨트롤러 (예 : 페이지 뷰 컨트롤러)
  • 네비게이션 뷰 컨트롤러
  • 탭 바 컨트롤러
  • 분할 뷰 컨트롤러

1
나는 여러 가지 이유로 전적으로 동의합니다. TabBarController를 NavigationController에 넣는 것은 좋은 생각이 아닙니다. 델리게이트가 그 안에 포함 된 뷰에 대해 제대로 실행되지 않으므로 최종 사용자가 인터페이스를 탐색하는 데 끔찍한 시간이 있기 때문입니다. 그들은 TabBar / Navigation 인터페이스로 이어지는 컨트롤러로 돌아가는 데 어려움을 겪을 것입니다. 다른 방법은 TabBarController 내부의 NavigationController 인 OK입니다. 최종 사용자를 혼동하지 말고 Apple의 제안을 듣는 것이 항상 최선의 방법입니다!
허버트 Kunnemeyer

1
그러나 기본 iPhone Music 앱은 바로 그 기능을 수행합니다 ( "지금 재생 중"부분).
Enzo Tran

참고 : 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.