Ich habe den von Rhabarber vorgeschlagenen RBStoryboardLink- Ansatz untersucht . Diese Implementierung ersetzt die Eigenschaften des View Controllers, was seltsam aussieht. Ich glaube, ich habe den Weg gefunden, dies zu vermeiden. Hier ist das Demo-Projekt .
Navigationssteuerungen
Navigationscontroller können einfach einen referenzierten Ansichtscontroller als Root festlegen. Die Implementierung eines solchen Ansichtscontrollers kann folgendermaßen aussehen:
@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
Controller anzeigen
Probleme beginnen, wenn Sie einen in einem externen Storyboard definierten View Controller verschieben möchten. Dies ist der Fall, wenn Eigenschaften kopiert werden. Stattdessen können wir einen benutzerdefinierten Abschnitt implementieren, der einen gefälschten Zielcontroller durch einen echten aus dem externen Storyboard ersetzt.
@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 wird als Platzhalter verwendet und enthält die für die Ersetzung erforderlichen Eigenschaften (storyboardName und sceneIdentifier).
@interface ExternViewController : UIViewController
@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;
@end
@implementation ExternViewController
@end
Wir müssen diese Eigenschaften und die benutzerdefinierte Klasse für den Platzhalteransichts-Controller festlegen. Außerdem können Sie den View Controller mit ExternStoryboardSegue verknüpfen.