iOS 15系统下UITableViewController使用自定义便利构造器崩溃问题
崩溃原因
这是iOS 15新增的UIViewController初始化校验导致的问题,根源是自定义构造器不符合Swift的构造器规则:
UITableViewController的init(style:)是便利构造器,它的指定构造器只有init(nibName:bundle:)和init(coder:)两类- 你把自定义的
init(data:)声明为指定构造器,直接调用父类的便利构造器super.init(style: .plain),违反了「指定构造器必须调用父类的指定构造器」的规则 - iOS 14及更低版本没有针对这类不规范实现做运行时断言,iOS 15新增了traitCollection初始化校验,当对象销毁时访问到未正确初始化的traitCollection就会触发崩溃。
修复方案
任选以下一种合规修改方式即可:
方案1:将自定义构造器改为便利构造器(推荐)
class CustomTableViewController : UITableViewController { var data:String? convenience init() { self.init(data: "test") } // 改为便利构造器,调用当前类的构造器而非父类 convenience init(data: String) { self.init(style: .plain) self.data = data } required init?(coder: NSCoder) { super.init(coder: coder) } }
方案2:调用父类指定构造器,手动配置TableView样式
class CustomTableViewController : UITableViewController { var data:String? convenience init() { self.init(data: "test") } init(data: String) { self.data = data // 调用父类的指定构造器 super.init(nibName: nil, bundle: nil) // 手动初始化对应样式的TableView self.tableView = UITableView(frame: .zero, style: .plain) } required init?(coder: NSCoder) { super.init(coder: coder) } }
修改后可兼容iOS 14、iOS 15及更高版本系统。
内容的提问来源于stack exchange,提问作者Philipp Hofmann
相关产品推荐
相关产品推荐

