IB Designables:无法呈现和更新自动布局状态

我有一个自定义视图( xib )里面有一个UIButton ,我做了ID IBDesignable做了以下事情:

UserView.swift

 import UIKit @IBDesignable class UserView: UIView { @IBOutlet var view: UIView! @IBOutlet weak var userButton: UIButton! override init(frame: CGRect) { super.init(frame: frame) load() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) load() } fileprivate func load() { Bundle.main.loadNibNamed("UserView", owner: self, options: nil) addSubview(view) self.frame = bounds } } 

UserView.xib

  • 添加了UIButton并设置了约束
  • 设置文件的所有者: UserView

故事板

我添加了一个UIView到一个Bar Button Item并分配了UserView类,但没有渲染,我得到了以下构建错误:

错误:IB Designables:无法呈现和更新FoodViewController(bR3-Kz-wX7)的自动布局状态:代理引发了exception。

我目前的环境: Xcode 9 ,Swift 4

我在我的Podfile的末尾添加了这个脚本,并再次执行了pod install 。 所以我可以正常建立我的项目。

 post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings.delete('CODE_SIGNING_ALLOWED') config.build_settings.delete('CODE_SIGNING_REQUIRED') end end 

我只是有完全相同的问题,唯一对我有用的不是使用主要的Bundle我必须得到我想要的Nib Bundle。 基本上改变:

 Bundle.main.loadNibNamed("UserView", owner: self, options: nil) 

至:

 let bundle = Bundle(for: UserView.self) bundle.loadNibNamed("UserView", owner: self, options: nil) 

这是奇怪的,就像在我的情况下,在LLDB中运行时比较两个Bundles它们是相同的(类名不同但我的其余设置与OP相同)

lldb截图

Xcode 9.3,CocoaPods 1.5.3可能是由于CocoaPods版本的最新更新。 请参阅此处的问题

我有这个错误IB Designables: Failed to render and update auto layout status在故事板中IB Designables: Failed to render and update auto layout status ,Stripe SDK中与Cocoapods相关的类STPPaymentCardTextField。

解决方案是将CocoaPods降级到1.4.0

 sudo gem list cocoapods sudo gem uninstall cocoapods sudo gem install cocoapods -v 1.4.0 pod update 

这个问题与这个答案有关。 检查两者。
无法呈现ClassName的实例:代理在bundle中引发exception加载nib

底线

确保您的xib文件没有任何孤立的sockets。 检查笔尖的每个视图/元素是否有sockets,然后删除并重新添加。

带插座的笔尖子视图

对我来说,他们是孤儿。 似乎nib和IB非常挑剔,调试器没有提供很多细节……如果你不能让它工作,你可能会从一个新的nib / xib文件开始。


我的工作代码演练

这个问题花了我几天时间来解决。 为了别人的利益,我给出了一个冗长的答案,并显示了我所有相关的代码和连接。

我实现修复操作(上面)的工作提交在这里: https : //github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Xcode版本9.2

我的文件结构

这是我的文件结构(注意:我正在使用名为ZMAppFoundation cocoapods创建一个pod。另外, ZMPieTimerView.swift与解决方案无关。):

在此处输入图像描述

我希望我的笔尖在Main.storyboard文件中可见(IBDesignable)。 这是我的xib的文件所有者和自定义类, ZMGauge.xib

文件的所有者 自定义类

代码,实现

这是我的ZMXibView类:

 // Adapted from https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d import UIKit @IBDesignable open class ZMXibView: UIView { var contentView:UIView? @IBInspectable var nibName:String? override open func awakeFromNib() { super.awakeFromNib() xibSetup() } func xibSetup() { guard let view = loadViewFromNib() else { return } view.frame = bounds view.autoresizingMask = [.flexibleWidth, .flexibleHeight] addSubview(view) contentView = view } func loadViewFromNib() -> UIView? { guard let nibName = nibName else { return nil } let bundle = Bundle(for: type(of: self)) let nib = UINib(nibName: nibName, bundle: bundle) return nib.instantiate( withOwner: self, options: nil).first as? UIView } override open func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() xibSetup() contentView?.prepareForInterfaceBuilder() } } 

在storyboard中,我的xib在Custom Class中指定。 我正在使用cocoapods来开发一个吊舱。 我已明确选择了该模块。 (请注意,在我的XibView类中,我必须定义nibName属性。):

在xib上设置自定义类

别忘了!

然后你可能需要清理,关闭Xcode,重建,或者只是等待一段时间让IB再次渲染它。 当Xcode决定尝试渲染IBDesignables时,我仍然是一个谜,我不知道一种强迫的方法。

成功

根据我的代码和我采取的操作,我的笔尖现在可以在我的Main.storyboard中查看IBDesignable。

nib现在可以查看了

以防你错过了它

万一你错过了,我的解决方案就在这篇文章的最顶层。 我通过删除一些孤立的IBOutlets来清除OP引用的错误。

对我来说,修复程序归结为让Interface Builder重绘对象。 我在两个地方都有这个,并且两个都没有修改代码,但代理错误的症状和故事板中的空白视图最终得到修复。

通过在视图和重建下将UIView拖动到不同的顺序来修复一个。 通过选择TableView将原型单元格的TableView中的第二个修复,将原型单元格的数量更改为两个,等待一秒,然后将其更改为一个。 TableView一直是白色空白,然后正确地绘制了所有元素,并且代理错误消失了。

感觉它是IB的一个错误,并且从其他搜索中,存在类似错误的许多解决方案。 希望这有助于某人。

(xCode 9.2,Swift 4)以下内容可能对您的确切问题没有帮助,但可能会帮助其他人遇到非常类似的问题。 这是我的错误:

错误:IB Designables:无法呈现和更新CustomExampleView(XXXXX)的自动布局状态:代理程序崩溃

删除CustomExampleView.xib和CustomExampleView.swift时,我能够删除错误。 为了复制,我重新创建了文件,转到.xib并将顶级视图的自定义类设置为CustomExampleView。

我的错误是将自定义类设置为.xib上的顶级视图,而不是在文件所有者上设置自定义类。 设置正确的自定义类后,我的问题解决了。

对我来说这个问题解决了,

  1. 更新播客。
  2. 对于swift库嵌入式选项,将构建设置更改为“$(inherited)”。
  3. 建筑,清洁,建筑。
  4. 关闭项目。
  5. 退出Xcode。
  6. 又跑了

哈哈哈老黑客:)谢谢!

不幸的是,您无法在IBDesignable中使用IBOutlets。 这里有更好的答案:

通过IBInspectable属性实时渲染IBOutlet连接子视图

也许你想让你的UserView扩展UIButton而不是UIView?

这是一些像1.5.0这样的cocoa豆荚版本的问题。 如果你正在使用这个,那么它导致渲染无法从当前版本移动到其他在终端中运行此命令

 sudo gem uninstall cocoapods 

您可以通过这样的方式安装任何特定版本

 sudo gem install cocoapods -v 1.4.0 

希望它对你有用。

我对此的原因并不是很了解,但我已经看过几次这样的事情,每次只需重新启动xcode就可以解决这个问题。 我认为这是每个人都应该开始的地方,如果这不起作用,那么你可以尝试其他建议的答案。

  post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings.delete('CODE_SIGNING_ALLOWED') config.build_settings.delete('CODE_SIGNING_REQUIRED') end end 

在Podfile中输入上述代码可以解决问题。 此代码仅通过Cocoapods消除了对已安装框架的代码签名要求。 但这似乎也是IBDesignable中的一个错误,因为使用Xcode 10下注4由于Xcode 10中包含新的构建系统,我没有得到这个错误。

我禁用了“用户特征变化”,我的问题解决了。