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와 연결합니다.