
之前提过 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_BUILDER tableVIEw.register(UINib(nibname: "MytableVIEwCell",bundle: Bundle(for: self.classForCoder)),forCellReuseIDentifIEr: "MytableVIEwCell")#else tableVIEw.register(UINib(nibname: "MytableVIEwCell",forCellReuseIDentifIEr: "MytableVIEwCell")#endif
我非常欢迎大家给我提问题(让人民群众监督我学习哈哈哈~~~~, 这不我就得重新理下Nib加载机制)
总结以上是内存溢出为你收集整理的解决UITableView xib添加到Storyboard出现IB Designables错误全部内容,希望文章能够帮你解决解决UITableView xib添加到Storyboard出现IB Designables错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)