Storyboard Name和identifier如果不对,将会抛出异常。怎么避免这个问题呢?
本文讨论的是如何从多个Storyboard中取出控制器实例。不用管控制在哪个Storyboard文件里,只要 控制器设置identifier为类名就OK。
使用UIViewController的类别方法
使用要求:
Storyboard中的ViewController的类名和Storyboard ID相同。
类别的头文件:
#import <UIKit/UIKit.h>
@interface UIViewController (Storyboard)
+ (nullable instancetype)dd_instanceFromStoryboardWithIdentifier:(nonnull NSString *)identifier;
+ (instancetype)dd_instanceFromStoryboard;
@end
使用 dd_instanceFromStoryboard 取出以调用者类名为identifier的实例即可。如果没有取到,返回nil
使用方式 :
YouViewController *vc = [YouViewController dd_instanceFromStoryboard];
具体实现步骤:
检查缓存里面有没有保存这个identifier对应的storyboard名字。如果有缓存,直接从这个storyboard里面取
获取NSBunble的storyboard文件列表。筛选出storyboard文件名
遍历这个列表,尝试取出实例。
获得实例后对storyboard名进行缓存,同时返回实例