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

时间:2017-10-13 06:22:54

标签: ios swift xcode interface-builder ibdesignable

我有一个自定义视图(xib),其中包含UIButton,我做了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

故事板

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

  

错误:IB Designables:无法呈现和更新自动布局状态   for FoodViewController(bR3-Kz-wX7):代理抛出异常。

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

14 个答案:

答案 0 :(得分:31)

我在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 。所以我可以正常建立我的项目。

{{1}}

答案 1 :(得分:18)

我只是遇到了完全相同的问题,而且对我来说唯一有用的不是使用主要的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 screenshot

答案 2 :(得分:6)

Xcode 9.3,CocoaPods 1.5.3 这可能是由于CocoaPods版本的最新更新所致。参见issue here

我在故事板中出现了此错误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

答案 3 :(得分:4)

  

这个问题与这个答案有关。检查两者。
  Failed to render instance of ClassName: The agent threw an exception loading nib in bundle

底线

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

A nib subview with an outlet

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

我的工作代码的演练

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

  

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

     

Xcode版本9.2

我的文件结构

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

enter image description here

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

File's Owner Custom Class

代码,实现

这是我的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属性。):

Setting custom class on the xib

别忘了!

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

成功

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

nib is viewable now

万一你错过了

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

  

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

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

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

答案 6 :(得分:2)

lastCell = yourWorkseet.UsedRange.End(xlUp)
firstEmtyRow = lastCell.Offset(RowOffset:=1).EntireRow

在Podfile中输入上述代码即可解决问题。此代码完全不需要通过Cocoapods对已安装的框架进行代码签名的要求。但这也似乎是IBDesignable中的错误,因为使用Xcode 10 bets 4时,由于Xcode 10中包含了新的构建系统,所以我没有得到此错误。

答案 7 :(得分:1)

这是一些可可豆荚版本如1.5.0的问题。 如果你使用这个,那么它会导致渲染失败 从当前版本移动到其他版本在终端

中运行此命令
sudo gem uninstall cocoapods

您可以通过提及此类

来安装任何特定版本
sudo gem install cocoapods -v 1.4.0

希望它适合你。

答案 8 :(得分:1)

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

  1. 更新广告连播。
  2. 将快速库的构建设置更改为“ $(继承)” 嵌入式选项。
  3. 建筑,清洁,建筑。
  4. 结束项目。
  5. 退出Xcode。
  6. 再次运行。

哈哈哈老hack :)谢谢!

答案 9 :(得分:1)

我很想知道这样做是多么愚蠢,但您可以尝试从

中删除中断的代码。
override func prepareForInterfaceBuilder() {

仅在

中使用
override func awakeFromNib() {

。当我报告执行此操作时,您所做的更改仍可能按需要反映在情节提要中时,我感到更加畏惧。

您可以通过注释掉所有行并使用消除过程来标识断行来标识断行代码。

答案 10 :(得分:0)

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

Live Render IBOutlet Connected Subviews Via IBInspectable Properties

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

答案 11 :(得分:0)

我对这起因并不十分了解,但是我已经多次看到这种情况了,而且每次通过重新启动xcode来解决此问题时,都可以看到。我认为这是每个人都应该开始的地方,如果那不起作用,那么您可以尝试其他建议的答案。

答案 12 :(得分:0)

XCode 11.6

如果您使用UITableView和原型单元格,请选择UITableView并在属性检查器中,只需增加原型单元格的数量即可。然后,xcode将自动再次构建它并解决该问题。解决后,将计数减少到先前的值。 enter image description here

答案 13 :(得分:-2)

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