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

Jon*_*ano 30 xcode interface-builder ios swift 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
    }

}
Run Code Online (Sandbox Code Playgroud)

UserView.xib

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

故事板

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

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

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

Har*_*dim 34

我在我的结尾添加了这个脚本Podfilepod 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
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用.我只是好奇问题是什么以及这段代码到底是做什么的.它会影响我项目中的其他任何内容吗? (3认同)
  • 这对任何框架都有任何副作用吗? (2认同)

Mik*_*elu 29

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

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
Run Code Online (Sandbox Code Playgroud)

至:

let bundle = Bundle(for: UserView.self)
bundle.loadNibNamed("UserView", owner: self, options: nil)
Run Code Online (Sandbox Code Playgroud)

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

lldb截图

  • 因为当InterfaceBuilder呈现时它没有运行应用程序.没有"主要应用程序包". (11认同)

Con*_*ena 6

Xcode 9.3,CocoaPods 1.5.3 可能是由于CocoaPods版本的最新更新所致。在这里查看问题

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
Run Code Online (Sandbox Code Playgroud)


Jac*_*vis 5

这个问题与此答案有关。同时检查。
无法呈现ClassName实例:代理在捆绑中装入笔尖时抛出异常

底线

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

带插座的笔尖子视图

对我来说,他们是孤儿商店。笔尖和IB似乎非常挑剔,并且调试器没有提供很多详细信息...如果无法正常工作,则可能会从一个新的nib / xib文件开始。


我的工作代码演练

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

我在其中实现了修复操作的工作提交在此处:https : //github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Xcode 9.2版

我的档案结构

这是我的文件结构(注意:我正在创建一个名为cocoapods的pod,ZMAppFoundation而且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()
    }
}
Run Code Online (Sandbox Code Playgroud)

在情节提要中,我的xib在“自定义类别”中指定。我正在用cocoapods开发豆荚。我已经明确选择了模块。(请注意,在我的XibView类中,必须定义nibName属性。):

在Xib上设置自定义类

别忘了!

然后,你可能需要干净,关闭的Xcode,重建,或等待一段时间的IB再次渲染它。对于Xcode决定尝试渲染IBDesignable的确切时间,这仍然是我的一个谜,而我不知道强制的方法。

成功

根据我的代码,我所采取的行动,我的笔尖现在在我的Main.storyboard IBDesignable可见。

笔尖现在可见

以防你错过了它

万一您错过了它,我的解决方案就在这篇文章的顶部。我得到了我通过删除某些孤立的IBOutlets清除由OP引用的错误。


Mar*_*ars 0

不幸的是,您不能在 IBDesignable 中使用 IBOutlet。在这里为您提供更好的答案:

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

也许您想让 UserView 扩展 UIButton,而不是 UIView?