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
UserView 我添加了一个UIView Bar Button Item并分配了UserView类,但没有渲染,我得到以下构建错误:
错误:IB Designables:无法呈现和更新FoodViewController(bR3-Kz-wX7)的自动布局状态:代理引发了异常.
我目前的环境:Xcode 9,Swift 4
Har*_*dim 34
我在我的结尾添加了这个脚本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
Run Code Online (Sandbox Code Playgroud)
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相同)
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)
这个问题与此答案有关。同时检查。
无法呈现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属性。):
然后,你可能需要干净,关闭的Xcode,重建,或等待一段时间的IB再次渲染它。对于Xcode决定尝试渲染IBDesignable的确切时间,这仍然是我的一个谜,而我不知道强制的方法。
根据我的代码,我所采取的行动,我的笔尖现在在我的Main.storyboard IBDesignable可见。
万一您错过了它,我的解决方案就在这篇文章的顶部。我得到了我通过删除某些孤立的IBOutlets清除由OP引用的错误。
不幸的是,您不能在 IBDesignable 中使用 IBOutlet。在这里为您提供更好的答案:
通过 IBInspectable 属性实时渲染 IBOutlet 连接子视图
也许您想让 UserView 扩展 UIButton,而不是 UIView?
| 归档时间: |
|
| 查看次数: |
26162 次 |
| 最近记录: |