iOS开发-[UITableViewController loadView]加载nib未获取UITableView报错咨询
该报错是UITableViewController的固有校验逻辑触发的:UITableViewController要求其自身的view属性必须是UITableView或其子类实例,当系统从nib(包括Storyboard、xib文件)加载该控制器的视图时,拿到的根视图是普通UIView而非UITableView,就会抛出该异常。
你提供的AppDelegate代码使用了UIScene生命周期管理,该报错和AppDelegate无关,问题出在你项目中某个继承自UITableViewController的控制器的IB配置/代码初始化逻辑上。
- 首先定位报错对应的控制器:在Xcode的断点导航器添加全局异常断点,重新运行项目,触发崩溃时就能定位到具体是哪个UITableViewController子类出了问题
- 打开该控制器对应的Storyboard或xib文件,查看控制器的根视图类型:如果右侧Identity检查器中展示的Class是
UIView而非UITableView,即可确认问题 - 检查控制器的
viewIBOutlet绑定:确认没有把view属性错误绑定到非UITableView的其他视图对象上 - 如果是纯代码初始化该控制器,检查初始化时是否错误传入了根视图为普通UIView的xib名称
根据你的业务需求二选一即可:
方案1:保留UITableViewController父类
直接把控制器的根视图类型修改为UITableView:选中IB中的根视图,在Identity检查器把Class修改为UITableView,之后按需给tableView添加约束、设置代理和数据源即可。
如果是纯代码创建控制器,不需要自定义loadView方法,或者在loadView中直接给self.view赋值为你创建的UITableView实例即可。
方案2:改用UIViewController作为父类
如果你不需要UITableViewController的默认特性(比如自动适配UIRefreshControl、默认实现tableView数据源/代理的空实现等),直接把控制器的父类从UITableViewController修改为UIViewController,之后手动添加tableView属性,遵守UITableViewDataSource、UITableViewDelegate协议实现相关逻辑即可。
内容的提问来源于stack exchange,提问作者Anonymous

