解决UITableView xib添加到Storyboard出现IB Designables错误

news/2024/12/19 20:30:46/

之前提过 Swift下自定义xib添加到Storyboard 的方法。最近有人问说按照文中方法会出现IBDesignables错误,导致在xcode Storyboard中无法显示。

这个应该是我漏讲了。如果你的自定义xib中有UITableView,而且UITableViewCell也是xib,一般这个错误肯定是加载的时候找不到对应的Bundle文件了。

错误如下:
这里写图片描述

IB Designables: Failed to render and update auto layout status for ViewController (BYZ-38-t0r): The agent threw an exception.
IB Designables: Failed to update auto layout status: The agent raised a
"NSInternalInconsistencyException" exception: Could not load NIB in bundle:
'NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)' with name 'MyTableViewCell'

为什么会出现这个错误?

这个就要说到ios xib(Storyborad)加载机制了,但apple把这个Bundle加载机制隐藏的很深,之后我会单独写一篇文章介绍xib(Storyborad)加载机制。这里我简单说下上面的错误是怎么导致的。

上面错误主要因为我们使用的了自定义的MyTableViewCell(Xib),在Storyboard渲染Build的时候,会去读取加载这个MyTableViewCell(Xib)。这个时候我们代码一般是这么写的:

tableView.register(UINib(nibName: "MyTableViewCell", bundle: nil),
forCellReuseIdentifier: "MyTableViewCell")

注意这一句:UINib(nibName: "MyTableViewCell", bundle: nil),这个在App运行起来没有问题,因为bundle = nil 则默认使用mainBundle,但是xcode中预览Storyboard的时候,我们App没有运行,所以根据上下文无法找到对应的Bundle,所以导致该Nib无法加载。
所以出现了上面的错误exception: Could not load NIB in bundle


那么如何修改呢?

很简单,既然根据上下文无法找到对应的Bundle,我们告诉它不就行了。改成:

tableView.register(UINib(nibName: "MyTableViewCell",bundle: Bundle(for: self.classForCoder)),forCellReuseIdentifier: "MyTableViewCell")

你也可以加载TARGET_INTERFACE_BUILDER来区分下。当然不区分也没关系。

#if TARGET_INTERFACE_BUILDERtableView.register(UINib(nibName: "MyTableViewCell",bundle: Bundle(for: self.classForCoder)),forCellReuseIdentifier: "MyTableViewCell")
#elsetableView.register(UINib(nibName: "MyTableViewCell",bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
#endif

我非常欢迎大家给我提问题(让人民群众监督我学习哈哈哈~~~~, 这不我就得重新理下Nib加载机制)


http://www.ppmy.cn/news/210252.html

相关文章

区块链技术综述

本篇论文发表于2016年11月《网络与信息安全学报》&#xff0c;作者&#xff1a;沈鑫&#xff0c;裴庆祺&#xff0c;刘雪峰。为了保存随时查阅&#xff0c;将文章在博客上转载备份&#xff0c;望作者谅解。 区块链技术综述 沈鑫1&#xff0c;裴庆祺1&#xff0c;刘雪峰2 &#…

祁东公交车线路大全--BYZ

(1)须知:2路、3路、4路、6路、7路为城-郊公交,K1路、5路、8路、9路、10路为城市公交。城郊公交开至县城周围乡镇或村,出城之后(大桥西转盘以南、城南加油站以南、天洞源以东、宏泰家具厂以西、新城花园以北)的各站不再赘述,只收录大站。9路审计局、高速连接线以南各站也…

【初等数论】指数、原根与不定方程

【初等数论】指数、原根与不定方程 1、指数 现在我们就开始为剩余系建立“坐标”,完全剩余系是连续的,剩余类本身就是很好的坐标,所以这里我们只需讨论既约剩余系。前面已经知道 ( a , m ) = 1 (a,m)=1 (a,m)=

byz培训(day01)

期待了很久的python接口自动化终于在5月8号开课了&#xff01;经过一天的学习&#xff0c;基本掌握了常用的接口测试方法以及postman与jmeter工具的使用。 在第一天的课程中&#xff0c;我学习到了不同类型接口的测试方法&#xff0c;如&#xff1a;key-value、json、http权限验…

byz培训(day02)

一、charles 1、charles抓取手机端数据&#xff08;android&#xff09; 1&#xff09;获取charles所在pc端的ip地址 2&#xff09;打开charles里的[proxy]-[proxy setting]&#xff0c;设置端口号&#xff0c;默认为8888 3&#xff09;设置手机wifi代理为“手动”&#xff0c;…

byz培训(day05)

1、高阶函数&#xff1a;如果一个函数的入参是一个函数名的话&#xff0c;那这个函数就是一个高阶函数 2、函数作用域&#xff1a;是就近原则,从里往外找&#xff0c;如果自己函数里有&#xff0c;就拿过来 # 如果自己的函数里面没有的话&#xff0c;就去它父级函数里面找 3、内…

Spring系列-10 事务机制

背景&#xff1a; 在 事务-1 事务隔离级别和Spring事务传播机制 中对事务的特性、隔离级别、Spring事务的传播机制结合案例进行了分析&#xff1b;在 事务-2 Spring与Mybatis事务实现原理 中对JDBC、Mybatis、Spring整合Mybatis实现事务的原理结合框架源码进行了介绍&#xff…

JUC基础-0602

7.Callable接口 创建线程的四种方式&#xff1a; 继承Thread实现Runnable实现Callable线程池方式 Runnable 缺少的一项功能是&#xff0c;当线程 终止时(run完成时)&#xff0c;我们无法使线程返回结果。为了支持此功能&#xff0c; Java 中提供了 Callable 接口。 Callabl…