iOS에서 여러 스토리 보드 사용


78

내 목표는 탭 응용 프로그램을 만든 다음 각 탭에 대한보기를 별도의 스토리 보드에 구성하는 것입니다.

스토리 보드 스크린 샷

내 메인 스토리 보드는 탭보기입니다.

그런 다음 2 개의 View Controller가있는 보조 스토리 보드 (storyboard # 2)를 만듭니다. 첫 번째 뷰 컨트롤러 (이니셜로 표시됨)에는 버튼이 있고 두 번째 뷰로가는 세그 (모달)가 있습니다.첫 번째 뷰 컨트롤러

스토리 보드 # 2에서 loadView를 서브 클래 싱하고 재정 의하여 뷰를로드 할 수있었습니다. loadView 재정의

다음은 시뮬레이터 출력입니다.

모의 실험 장치

"click me"버튼을 클릭하면 EXC_BAD_ACCESS. segue가 작동하지 않습니다. 두 번째 스토리 보드가 완전히로드되지 않은 것 같습니다.

누구든지 전에 이것을 시도하고 작동하게 했습니까? SkillMaster.net의 YouTube 비디오가 있지만 보조 스토리 보드에서 segue가 작동하는지 보여주지 않습니다. 비디오는 여기에 있습니다 : http://youtu.be/D4_twoYvB4M

모든 의견과 도움에 감사드립니다!

스크린 샷 :


20
이것이 좋은 습관인지는 잘 모르겠지만 다음을 원합니다. 1. 크고
비대해진

iOS5 이전에 사용했던 .xib 파일을 사용해 볼 수 있을까요? 스토리 보드와 결합하기에는 너무 어렵지 않아야합니다.
Tom van der Woerdt 2011

스토리 보드를 사용하여이 작업을 수행 할 수 있는지 알고 싶습니다. XIB는 확실히 작동합니다.
Daddycat Tan Yin 참조

5
큰 병합 충돌 친화적 인 XML 파일 분할 아이디어 1000
피에르 드 LESPINAY

단일 제품이 아닌 제품 라인을 구축 할 때 여러 스토리 보드가 의미가있을 수 있습니다. 이 경우, 코어 / 바닐라 제품에 대한 하나의 스토리 보드 및 각 사용자 정의 제품에 대한 하나의 스토리 보드가
키릴 Gamazkov

답변:


82

여러 스토리 보드에서 본 최고의 기사입니다.

이 사람은 코드로 새 스토리 보드를 만드는 방법을 알려줄뿐만 아니라

  • 실제로 여러 스토리 보드를 권장합니다 (더 많은 모듈 식 코드).
  • xib와 스토리 보드를 사용하는 경우에 대해 설명합니다 (xibs는 뷰를 보유하고 스토 보드는 컨트롤러를 기반으로 함).
  • github의 segues와 스토리 보드를 연결하는 클래스를 제공합니다.

여러 스토리 보드의 주요 단점은 일반적으로 segues와 연결할 수 없다는 것이므로이 마지막 요점은 중요하지만 robs 라이브러리는 약간의 퍼징으로이를 허용합니다.

여기 에서 논의 된 내용도 참조 하십시오.


44

OP는 답변을 포함하도록 질문을 편집했습니다.

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"HelpStoryboard" bundle:nil];
UIViewController* initialHelpView = [storyboard instantiateInitialViewController];

initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:initialHelpView animated:YES];

물론 이것을 어디에서 호출하는지는 의미가 있습니다. 2 개의 스토리 보드와 해당 뷰 스택이 메모리에있을 수 있기 때문입니다. 따라서 다른 스토리 보드의 뷰 컨트롤러 외부에서이 코드를 호출하는 것이 가장 좋습니다.


2
그 질문은 당신이 사용하는 경우에이 조각을 둘 것입니다 생각 어떤 경우에? 내가 같은 상황에 직면하고있다. :-( SO에서 제거하고, 내가 함께 후크 수있는 곳 난 정말 볼 수없는 UITabbarController인스턴스화하는 . 각 탭에 대한 올바른 스토리 보드는 것이다 대표는 tabBarController:shouldSelectViewController:적합?
장 - 드니 Muys

2
위의 접근 방식을 사용하고 있지만 탭 막대는 사용하지 않습니다. 이 코드를 버튼의 선택기에서 지정한 작업 방법에 넣었습니다. 기본적으로 코드는 segued-to 장면을 자체 스토리 보드로 이동하기 전에 prepareForSegue에서했던 것과 동일합니다. 처음에 내가 만든 한 가지 실수는 내 새 스토리 보드의 기본 뷰가 UINavigationController에 포함되어 있다는 것입니다. 설정 한 후 탐색 컨트롤러 대신 뷰를 표시하려고했습니다.
Rhubarb

19

Rhubarb에서 제안한 RBStoryboardLink 접근 방식을 검토했습니다 . 이 구현은 이상하게 보이는 뷰 컨트롤러의 속성을 대체합니다. 나는 이것을 피할 방법을 찾았다 고 믿는다. 여기 데모 프로젝트가 있습니다.

내비게이션 컨트롤러

탐색 컨트롤러는 참조 된 뷰 컨트롤러를 루트로 설정할 수 있습니다. 이러한 뷰 컨트롤러의 구현은 다음과 같습니다.

@interface ExternNavigationController : UINavigationController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternNavigationController

- (void)awakeFromNib
{
    NSAssert(self.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil];
    UIViewController *vc = self.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:self.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    self.viewControllers = @[vc];
}

@end

컨트롤러보기

외부 스토리 보드에 정의 된보기 컨트롤러를 푸시하려는 경우 문제가 시작됩니다. 속성이 복사되는 경우입니다. 대신 가짜 대상 컨트롤러를 외부 스토리 보드의 실제 컨트롤러로 대체하는 사용자 지정 segue를 구현할 수 있습니다.

@interface ExternStoryboardSegue : UIStoryboardSegue

@end

@implementation ExternStoryboardSegue

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(ExternViewController *)destination
{
    NSAssert(destination.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:destination.storyboardName bundle:nil];
    UIViewController *vc = destination.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:destination.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    return [super initWithIdentifier:identifier source:source destination:vc];
}

- (void)perform
{
    [[self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:YES];
}

@end

ExternViewController는 자리 표시 자로 사용되며 대체 속성 (storyboardName 및 sceneIdentifier)에 필요한 항목을 포함합니다.

@interface ExternViewController : UIViewController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternViewController

@end

자리 표시 자 뷰 컨트롤러에 대해 이러한 속성과 사용자 지정 클래스를 설정해야합니다. 또한 뷰 컨트롤러를 ExternStoryboardSegue와 연결합니다.

IB 스크린 샷


1
나는 더 나은 솔루션이를 개선하기 위해 노력 github.com/jeremygrenier/JGLinkedStoryboard
제레미 Grenier의

16

내 XIB 파일 중 하나에서 GUI의 더 복잡한 부분으로 이동하고 있으며이 부분에서는 Storyboard를 사용하고 있습니다. 따라서 내 XIB의 버튼은 스토리 보드로 이동합니다. 이것에 대한 코드는 다음과 같습니다.

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardIdentifier" bundle:nil];
UIViewController* myStoryBoardInitialViewController = [storyboard instantiateInitialViewController];

[self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];

그러면 내 StoryBoard가 뷰에 성공적으로 푸시됩니다. 위의 코드는 "Touch Up Inside"액션 버튼에서 호출됩니다.


9

Xcode 7 (및 iOS8로 다시 포팅)에서와 마찬가지로 이제 스토리 보드 참조를 가질 수 있습니다. 이 WWDC 2015 세션 에서 언급되었습니다 (첫 한 시간 정도에 대해 이야기하기 시작합니다). 기본적으로해야 할 일은 별도의 스토리 보드로 이동하려는 ViewController를 선택하고 Editor-> Refactor to Storyboard ...를 클릭하는 입니다. 이름과 짜잔을 줘 :

여기에 이미지 설명 입력

새 스토리 보드로 이동 된 VC가 있고 외부에서 참조되지 않은 VC가있는 경우 (어떻게해야하는지) main.storyboard에서 해당 참조를 삭제해야합니다 (신규 생성 된 스토리 보드에 남아있게됩니다. 참조 만 삭제).


7

Apple의 문서에 따르면 여러 스토리 보드가있을 수 있습니다. 불행히도 그들은 그것을 수행하는 방법에 대한 실제 세부 사항을 다루지 않습니다. 아시다시피 Interface Builder는 도움이되지 않으므로 코드에서 수행해야합니다. XIB를로드하는 것과 매우 유사합니다.

[UIStoryboard storyboardWithName:@”MyNewStoryboard” bundle:myBundle]

당신이 당신의 코멘트에서 말했듯이 "하나의 큰 / 비 대한 스토리 보드를 원하지 않는다면"XIB가 정말로 갈 길이다. 그 '거대 함'이 장점입니다. VC 간의 모든 전환이 한 곳에 배치됩니다. 스토리 보드가 여러 개 있으면 앱을 통해 서로 다르고 관련이없는 여러 흐름을 지원할 수 있습니다. 예를 들어, 하나는 복잡한 구성 흐름을위한 것이고 다른 하나는 기본 사용자 흐름을위한 것입니다.


25
가장 큰 문제는 하나의 스토리 보드를 병합하는 것이 악몽 인 3 명 이상의 팀에서 작업 할 때입니다.
Brian Liang

2
그게 문제라고 생각합니다. 스토리 보드에는 거친 가장자리가 많이 있습니다. 당신의 요점은 하나 더입니다.
Tim

4
악몽이 병합되는 것을 피하기 위해 스토리 보드가 제공하는 모든 편안함을 떨어 뜨릴 필요가 없습니다. 서로 다른 독립 영역을 분리하고 각 영역에 별도의 스토리 보드를 할당하면됩니다. 모든 내부 전환에 대해 스토리 보드의 모든 마법이 그대로 유지됩니다. 탭 응용 프로그램은이 시나리오에 가장 적합합니다. 설정 화면도 있습니다. 단일 개발자라도 스토리 보드를 여러 독립된 부분으로 분할하는 것이 여전히 관련이있을 수 있습니다.
KPM

2

두 번째 스토리 보드에 performSegueWithIdenitfier 호출에 사용할 이름이 지정된 segue가있는 경우 소스 ViewController의 "Identity"탭에서 "Storyboard ID"필드를 설정해야합니다.

예를 들어 "segue1"이라는 segue가있는 "ViewController1"이라는 VC를 다른 VC에 제공 한 경우 "ViewController1"의 "Storyboard ID"를 무엇이든 ( "viewC1"또는 기타) 설정 한 다음 ViewController1.m에서 다음을 수행 할 수 있습니다. [self performSegueWithIdentifier : @ "segue1"sender : self]를 사용합니다.


2

Xcode 8.2.1

외부 스토리 보드에서 뷰 컨트롤러를 참조 할 수 있습니다.

TabBarController에서 Storyboard Reference 로의 관계

UITabBarController에서 외부 스토리 보드 참조 로 연결을 끌어 "뷰 컨트롤러"관계로 추가합니다. 메인 스토리 보드에서는 "항목 / 정사각형"으로 표시되지만 외부 스토리 보드에서는을 추가 UITabBarItem하고 탭의 이름과 이미지를 정의 해야합니다 .

여기에 이미지 설명 입력

Storyboard Reference가 선택 되면 속성 관리자 입니다.

또한 외부 컨트롤러에 스토리 보드 (여기에 표시되지 않음) 에서 "스토리 보드 ID"를 제공 하고 참조에서 이름을 참조해야합니다.


1

이 작업을 수행하려면 아래 단계를 따르십시오.

1 단계 : Storyboard Reference구성 요소 검색 (스크린 샷 참조)

2 단계 : 새 스토리 보드 참조를 선택합니다. (스크린 샷 참조)

3 단계 : 새 스토리 보드 이름과 초기 뷰 컨트롤러 식별자 식별자 제공 (스크린 샷 참조)

여기에 이미지 설명 입력

빌드 및 실행. 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.