无法呈现 ClassName 的实例:代理抛出异常加载包中的 nib
Failed to render instance of ClassName: The agent threw an exception loading nib in bundle
当我在故事板或另一个 nib 中包含我的自定义 IBDesignable 视图时,代理崩溃并抛出异常,因为它无法加载 nib。
error: IB Designables: Failed to update auto layout status: The agent raised a "NSInternalInconsistencyException" exception: Could not load NIB in bundle: 'NSBundle (loaded)' with name 'StripyView'
这是我用来加载笔尖的代码:
override init(frame: CGRect) {
super.init(frame: frame)
loadContentViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadContentViewFromNib()
}
func loadContentViewFromNib() {
let nib = UINib(nibName: String(StripyView), bundle: nil)
let views = nib.instantiateWithOwner(self, options: nil)
if let view = views.last as? UIView {
view.frame = bounds
view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
addSubview(view)
}
}
当我在模拟器中 运行 时,视图从笔尖正确加载,为什么它不显示在 Interface Builder 中?
当 Interface Builder 呈现您的 IBDesignable
视图时,它会使用帮助程序加载所有内容。这样做的结果是设计时的 mainBundle
与辅助应用相关,而不是您应用的 mainBundle
。可以看到报错中提到的路径与你的app无关:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays
加载 nib 时,您依赖于以下事实:在 运行 时传递 bundle: nil
默认为应用程序的 mainBundle
。
let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)
因此,您需要在此处传递正确的包。用以下内容修复上面的行:
let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)
这将使 Interface Builder 从与您的自定义视图相同的包中加载您的 nib class。
这适用于您的自定义视图从捆绑包中加载的任何内容。例如,本地化的字符串、图像等。如果您在视图中使用这些,请确保使用相同的方法并显式传入自定义视图的包 class.
与"Josh Heald"相同的观点,我们不能为bundle传递nil。和
这是对象中的对象 - C:
- (UIView *) loadViewFromNib{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0];
return v;
}
当我在故事板或另一个 nib 中包含我的自定义 IBDesignable 视图时,代理崩溃并抛出异常,因为它无法加载 nib。
error: IB Designables: Failed to update auto layout status: The agent raised a "NSInternalInconsistencyException" exception: Could not load NIB in bundle: 'NSBundle (loaded)' with name 'StripyView'
这是我用来加载笔尖的代码:
override init(frame: CGRect) {
super.init(frame: frame)
loadContentViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadContentViewFromNib()
}
func loadContentViewFromNib() {
let nib = UINib(nibName: String(StripyView), bundle: nil)
let views = nib.instantiateWithOwner(self, options: nil)
if let view = views.last as? UIView {
view.frame = bounds
view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
addSubview(view)
}
}
当我在模拟器中 运行 时,视图从笔尖正确加载,为什么它不显示在 Interface Builder 中?
当 Interface Builder 呈现您的 IBDesignable
视图时,它会使用帮助程序加载所有内容。这样做的结果是设计时的 mainBundle
与辅助应用相关,而不是您应用的 mainBundle
。可以看到报错中提到的路径与你的app无关:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays
加载 nib 时,您依赖于以下事实:在 运行 时传递 bundle: nil
默认为应用程序的 mainBundle
。
let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)
因此,您需要在此处传递正确的包。用以下内容修复上面的行:
let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)
这将使 Interface Builder 从与您的自定义视图相同的包中加载您的 nib class。
这适用于您的自定义视图从捆绑包中加载的任何内容。例如,本地化的字符串、图像等。如果您在视图中使用这些,请确保使用相同的方法并显式传入自定义视图的包 class.
与"Josh Heald"相同的观点,我们不能为bundle传递nil。和 这是对象中的对象 - C:
- (UIView *) loadViewFromNib{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0];
return v;
}