这是完全可行且明智的做法 - 简化你的Storyboard可以使接口文件更加整洁易读,减少在Xcode中的加载时间并实现更好的分组编辑。
我一直在Stack Overflow上搜寻,并注意到大家都在使用自定义转场或编程方式来实例化选项卡设置。哎呀。我拼凑出了一个简单的UIViewController子类,你可以将其用作Storyboard的占位符。
代码:
头文件:
#import <UIKit/UIKit.h>
@interface TVStoryboardViewController : UIViewController
@end
实现文件:
#import "TVStoryboardViewController.h"
@interface TVStoryboardViewController()
@property (nonatomic, strong) UIViewController *storyboardViewController;
@end
@implementation TVStoryboardViewController
- (Class)class { return [self.storyboardViewController class]; }
- (UIViewController *)storyboardViewController
{
if(_storyboardViewController == nil)
{
UIStoryboard *storyboard = nil;
NSString *identifier = self.restorationIdentifier;
if(identifier)
{
@try {
storyboard = [UIStoryboard storyboardWithName:identifier bundle:nil];
}
@catch (NSException *exception) {
NSLog(@"Exception (%@): Unable to load the Storyboard titled '%@'.", exception, identifier);
}
}
_storyboardViewController = [storyboard instantiateInitialViewController];
}
return _storyboardViewController;
}
- (UINavigationItem *)navigationItem
{
return self.storyboardViewController.navigationItem ?: [super navigationItem];
}
- (void)loadView
{
[super loadView];
if(self.storyboardViewController && self.navigationController)
{
NSInteger index = [self.navigationController.viewControllers indexOfObject:self];
if(index != NSNotFound)
{
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[viewControllers replaceObjectAtIndex:index withObject:self.storyboardViewController];
[self.navigationController setViewControllers:viewControllers animated:NO];
}
}
}
- (UIView *)view { return self.storyboardViewController.view; }
@end
描述:
- 视图控制器使用其恢复标识符在您的项目中实例化一个故事板。
- 加载后,它将尝试使用故事板的初始视图控制器替换其UINavigationController的viewController数组中的自身。
- 在请求时,此子类将返回Storyboard的初始视图控制器的UINavigationItem。这是为了确保加载到UINavigationBars中的导航项与交换后的视图控制器相对应。
用法:
要使用它,请将其分配为UIViewController的子类,该UIViewController属于UINavigationController中的一个Storyboard中。
分配恢复ID即可。
设置:
以下是如何在Storyboard中设置的步骤:
此设置显示带有导航控制器作为其第一个选项卡控制器的选项卡控制器。每个导航控制器都有一个简单的UIViewController作为其根视图控制器(我已将UIImageView添加到占位符中,以便更容易记住它链接到哪里)。每个都是TVStoryboardViewController的子类。每个设置为他们应该链接到的Storyboard的恢复ID。
一些优势:
- 它似乎最适合模态演示,其中子类是导航控制器的根视图控制器。
- 子类不会将任何控制器推入堆栈-它会进行交换。这意味着您不必手动隐藏返回按钮或在其他地方覆盖选项卡行为。
- 如果您双击选项卡,则会像预期的那样带您进入故事板的初始视图(您不会再次看到该占位符)。
- 非常简单的设置-无需自定义segues或设置多个子类。
- 您可以向占位符视图控制器添加UIImageView和任何您喜欢的内容,以使您的Storyboard更清晰-它们永远不会显示出来。
一些限制:
- 此子类需要属于UINavigationController中的某个位置。
- 此子类仅实例化故事板中的初始视图控制器。如果要实例化链中更深的视图控制器,您可以随时进一步拆分您的故事板并重新应用此子类技巧。
- 在推送视图控制器时,此方法效果不佳。
- 当用作嵌入式视图控制器时,此方法效果不佳。
- 通过segues进行消息传递可能不起作用。这种方法适用于界面部分是唯一的、不相关部分(以模态方式或通过选项卡栏呈现)的设置。
此方法是为了解决此UITabBarController问题而编写的,因此请将其用作更大问题的部分解决方案。我希望Apple能改进对“多个故事板”的支持。但对于UITabBarController设置,它应该很好用。