Typhoon框架使用求助:项目启动触发NSInvalidArgumentException崩溃
Typhoon框架结合VIPER模板启动崩溃排查方案
嘿,我之前在项目里用Typhoon搭配Generamba VIPER模板时也踩过类似的坑,咱们一步步来拆解问题:
问题回顾
你按以下流程操作后启动项目崩溃:
- 用GENERAMBA(VIPER模板)生成类文件
- 在Storyboard中创建UIViewController
- 给VC设置
typhoonKey运行时属性 - Storyboard文件名与VC类名保持一致
- 在plist中配置Assembly类
崩溃报错片段:
2018-04-19 10:40:29.436958+0300 BeeBooks Dev[6472:1952490] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't find definition for sp...
(报错截断了,但大概率是Typhoon找不到你要注入的某个组件定义,比如Presenter、Interactor这类VIPER角色)
核心排查方向&解决方案
1. 检查typhoonKey与Assembly组件名的匹配度
Typhoon完全靠typhoonKey关联Storyboard里的VC和Assembly中的组件定义,这是最容易出错的点:
- 打开Storyboard,选中VC查看运行时属性里的
typhoonKey,确认它和Assembly中注册该VC(或其依赖)的方法名完全一致——大小写、拼写、甚至下划线都不能错。比如Assembly里的方法是- (BookListViewController *)bookListViewController,那typhoonKey必须填bookListViewController。 - 同时要确认:你用Generamba生成VIPER类后,有没有在Assembly里添加对应的组件注册方法?别漏了把VC、Presenter这些角色加入Typhoon的容器中。
2. 确认Assembly类被Typhoon正确加载
你提到在plist里加了Assembly类,要再核对这几点:
- plist中的
TyphoonAssemblies数组里,是否填了Assembly的完整类名?如果你的Assembly带命名空间(比如BBAppAssembly),要确保没有写错前缀或者类名。 - 检查App启动时的Typhoon初始化逻辑:比如在
AppDelegate里,有没有正确调用[TyphoonComponentFactory factoryWithAssemblyClasses:@[[BBAppAssembly class]]],或者通过plist方式完成容器初始化?如果初始化代码有问题,Assembly里的组件根本不会被加载。
3. 排查VIPER组件的依赖注入是否完整
VIPER模式下,VC依赖Presenter,Presenter依赖Interactor,任何一个依赖没在Assembly里注册,都会导致Typhoon找不到定义:
- 打开Assembly类,确认每个VIPER角色都有对应的工厂方法,并且依赖注入正确。举个例子:
- (BookListPresenter *)bookListPresenter { return [TyphoonDefinition withClass:[BookListPresenter class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(interactor) with:self.bookListInteractor]; }]; } - (BookListViewController *)bookListViewController { return [TyphoonDefinition withClass:[BookListViewController class] configuration:^(TyphoonDefinition *definition) { [definition injectProperty:@selector(presenter) with:self.bookListPresenter]; }]; } - 确保所有需要注入的组件都在Assembly中有定义,没有遗漏任何一个VIPER角色的注册。
4. 核对Storyboard与VC类名的匹配
你说Storyboard以类名命名,要注意这两个细节:
- Storyboard的文件名必须和VC类名完全一致,包括大小写——iOS系统对文件名大小写是敏感的(尤其是真机环境),比如VC是
BookListViewController,Storyboard就得叫BookListViewController.storyboard。 - 检查Storyboard中VC的类设置:有没有把默认的
UIViewController改成你用Generamba生成的那个VC类?如果类没选对,Typhoon自然找不到对应的组件。
如果以上排查都没问题,建议把完整的报错信息贴出来(现在的报错里sp...应该是某个组件的前缀,比如spBookPresenter),这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者Gleb Belyaev
相关产品推荐
相关产品推荐

