You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:18:04