iOS13+ Storyboard依赖注入与场景自定义对象兼容问题咨询
问题原因与解决方案
兼容性结论
iOS 13引入的基于@IBSegueAction的Storyboard依赖注入能力,完全兼容场景内添加的三类自定义对象:自定义类Object、自定义类额外视图、自定义类手势,你遇到的崩溃是Storyboard连接配置错误导致的,和功能本身兼容性无关。
崩溃原因
你收到的报错信息如下:
Thread 1: "Custom instantiated <pocStoryboardDependencyInjection.ListCountriesViewController: 0x148005e40> must be kind of class pocStoryboardDependencyInjection.CustomObject"
报错的核心原因是:你把为ListCountriesViewController提供实例的createListCountriesViewController segueAction,错误绑定给了场景内的CustomObject对象。系统在实例化场景时会先后触发两次该方法:
- 第一次是实例化
ListCountriesViewController本身,返回的控制器类型匹配,执行正常 - 第二次是实例化
CustomObject对象时,系统误调用了同一个segueAction,拿到的返回值是ListCountriesViewController类型,和期望的CustomObject类型不匹配,因此抛出类型不兼容异常
删除自定义对象后没有了第二次调用,因此问题消失。
修复步骤
你现有的代码逻辑完全正确,不需要修改,只需要修正Storyboard的连接配置即可:
- 打开两个场景之间的segue的「Connection Inspector」,确认
createListCountriesViewController仅绑定到segue的instantiation属性上,没有其他额外绑定 - 打开
ListCountriesViewController场景的「Connection Inspector」,找到你添加的CustomObject对象,删除其错误绑定的SegueAction连接 - 修复后
CustomObject会被系统自动实例化,并通过IBOutlet正常注入到ListCountriesViewController的customObject属性中
三类自定义对象的使用说明
- 自定义类Object:直接在Storyboard场景中拖入「Object」组件,修改为自定义类后绑定IBOutlet即可,不需要额外编写实例化逻辑
- 自定义类额外视图:直接在场景中添加视图,修改为自定义类后绑定IBOutlet即可正常使用,依赖注入流程不受影响
- 自定义类手势:直接在场景中拖入对应的手势识别器,修改为自定义类后绑定action或IBOutlet即可正常使用
class ViewController: UIViewController { @IBSegueAction func createListCountriesViewController(_ coder: NSCoder, sender: Any?, segueIdentifier: String?) -> ListCountriesViewController? { let controller = ListCountriesViewController(coder, userForm: ["field1"]) return controller } } class ListCountriesViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var customObject: CustomObject! private let userForm: UserForm init?(_ coder: NSCoder, userForm: UserForm) { self.userForm = userForm super.init(coder: coder) } required init?(coder: NSCoder) { fatalError() } } class CustomObject: NSObject { }
内容的提问来源于stack exchange,提问作者Blazej SLEBODA
相关产品推荐
相关产品推荐

