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相同)
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
属性。):
别忘了!
然后你可能需要清理,关闭Xcode,重建,或者只是等待一段时间让IB再次渲染它。 当Xcode决定尝试渲染IBDesignables时,我仍然是一个谜,我不知道一种强迫的方法。
成功
根据我的代码和我采取的操作,我的笔尖现在可以在我的Main.storyboard中查看IBDesignable。
以防你错过了它
万一你错过了,我的解决方案就在这篇文章的最顶层。 我通过删除一些孤立的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上的顶级视图,而不是在文件所有者上设置自定义类。 设置正确的自定义类后,我的问题解决了。
对我来说这个问题解决了,
- 更新播客。
- 对于swift库嵌入式选项,将构建设置更改为“$(inherited)”。
- 建筑,清洁,建筑。
- 关闭项目。
- 退出Xcode。
- 又跑了
哈哈哈老黑客:)谢谢!
不幸的是,您无法在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中包含新的构建系统,我没有得到这个错误。
我禁用了“用户特征变化”,我的问题解决了。