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


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.