Я вивчив підхід RBStoryboardLink, запропонований Rhubarb. Ця реалізація замінює властивості контролера подання, що виглядає дивним. Я вважаю, що знайшов спосіб уникнути цього. Ось демонстраційний проект .
Навігаційні контролери
Контролери навігації можуть просто встановити контролер подання, на який посилаються, як корінь. Реалізація такого контролера перегляду може виглядати так:
@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
Перегляньте контролери
Проблеми починаються, коли потрібно натиснути контролер перегляду, визначений у зовнішній розкадровці. Це той випадок, коли властивості копіюються. Замість цього ми можемо реалізувати власну програму, яка замінить підроблений контролер призначення справжнім із зовнішньої розкадровки.
@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.