Reputation: 3546
I have an Objective-C and Swift mixed dynamic framework. And the mixed framework was linked with two pure Objective-C dynamic frameworks.
When I tried to mark any class in the mixed framework with IB Designable and using that class in either storyboard or nib, the Xcode always says the instance of it was failed to render.
And there was the error message:
IB Designables: Failed to render instance of WZUITokenField: dlopen(WZUIKit.framework, 1): Library not loaded: /Library/Frameworks/WZFoundation.framework/WZFoundation Referenced from: WZUIKit.framework Reason: image not found
IB Designables: Failed to update auto layout status: dlopen(WZUIKit.framework, 1): Library not loaded: @rpath/WZFoundation.framework/WZFoundation Referenced from: WZUIKit.framework Reason: image not found
The framework WZUIKit is an Objective-C and Swift mixed framework and the WZFoundation is pure Objective-C.
Plus, all these sutff work on either device or the simulator.
Upvotes: 65
Views: 37876
Reputation: 1385
[I put this answer here for people like me finding this very similar thread without being able to find a solution]
I had a similar issue while using Cocoapods
1.9.1
, the error message was related to a path error
as follow (I added NewLines for the sake of lisibility):
error: IB Designables:
Failed to render and update auto layout status for
UITableViewController (kDz-VB-YcS):
dlopen(YOUR_FRAMEWORK.framework, 1):
Library not loaded: @rpath/YOUR_FRAMEWORK.framework/YOUR_FRAMWORKReferenced
from: YOUR_FRAMEWORK.frameworkReason: image not found
Here is the link to the thread: Cocoapods Issue 7606
And in the comments, someone posted a solution (that works for me). You need to put this post_install
rule at the very end of your Podfile
:
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
next unless config.name == 'Debug'
config.build_settings['LD_RUNPATH_SEARCH_PATHS'] = [
'$(FRAMEWORK_SEARCH_PATHS)'
]
end
end
Then execute again pod install
, and it should now works
Hope it helps~
Upvotes: 0
Reputation: 2005
In my case it inside private pod. Xcode Version 10.3 (10G8)
The solution is very simple in my case - I just forget to add public
in-between of @IBInspectable var
right variant:
import UIKit
@IBDesignable public class BorderedView: UIView {
@IBInspectable public var borderColor: UIColor? = UIColor.white {
didSet {
if let actualColor = borderColor {
layer.borderColor = actualColor.cgColor
} else {
layer.borderColor = UIColor.white.cgColor
}
setNeedsDisplay()
}
}
@IBInspectable public var borderWidth: CGFloat = 1 {
didSet {
layer.borderWidth = borderWidth
setNeedsDisplay()
}
}
}
P.S.: Editor -> Debug Selected Views did nothing in my case
P.S.2 : AlignedCollectionViewFlowLayout pod from the dependency of my private pod and definitely not relevant to this issue.
P.S.3: Issue still here
Upvotes: 1
Reputation: 41
I also experienced this on a Mac project and Xcode 7.3.1. In my case, the framework referenced in the Failed to Render error message was not related to drawing at all.
Simply going to the target's General/Linked Frameworks and Libraries tab and changing the offending framework's Status from Required to Optional allowed the IBDesignables to update and draw properly in IB.
Upvotes: 4
Reputation: 3726
I had a similar error which was caused by my Framework's views not having public initialisers:
public override init(frame: CGRect) {
super.init(frame:frame)
commonInit()
}
required public init(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
Upvotes: 0
Reputation: 3637
I hit this error on a framework containing IBDesignables.
I had to add $(FRAMEWORK_SEARCH_PATHS)
to the LD_RUNPATH_SEARCH_PATHS
setting on my framework target.
After updating the runpath setting, building, and refreshing the view in the storyboard, the error went away. Didn't even have to clean the build folder.
Upvotes: 11
Reputation: 1
Follow the below steps:
Upvotes: -2
Reputation: 1565
If you have the same issue building a Mac App, adding @loader_path/../Frameworks
to Runpath Search Paths
solved this for me.
Upvotes: 20
Reputation: 3546
Finally, I solved this issue by adding $(CONFIGURATION_BUILD_DIR)
in the target's build settings' Runpath Search Paths
field.
Plus, there are some additional steps you might need to do with your Xcode.
~/Library/Developer/Xcode/DerivedData
Editor
menu and do Refresh All Views
; wait for build to be completed and errors should be goneCredit to @Mojtaba
Upvotes: 84
Reputation: 385500
I had this problem in an OS X project.
In my case, the problem was an old project (NMSSH) containing a framework target with bad build settings. Specifically:
INSTALL_PATH
was set to @executable_path/../Frameworks
, but the correct setting is /Library/Frameworks
SKIP_INSTALL
was not set and defaults to NO
, but the correct setting is YES
DYLIB_INSTALL_NAME_BASE
was not set, but the correct setting is @rpath
Note that all of the correct settings are what you get automatically for a newly-created framework target.
After changing the settings to the correct values, Xcode was able to load my @IBDesignable
view in the storyboard.
Upvotes: 1
Reputation: 1585
I just figured out another reason in my case:
When I used 'Editor -> Debug Selected Views' I saw that it crashed, because I was using CoreGraphics to create an image and use it as background image for a button:
class func imageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRectMake(0.0, 0.0, size.width, size.height);
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0);
let context = UIGraphicsGetCurrentContext(); // It's alraedy nil here :(
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillRect(context, rect);
let image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
The reason is simply that size is (0.0, 0.0). Why is that? I am calling
super.setBackgroundImage(UIImage.imageWithColor(bgColor, size: self.bounds.size), forState: .Normal)
But in IB self.bounds.size is still 0 at this point! So I changed one line:
let rect = CGRectMake(0.0, 0.0, max(size.width, 1.0), max(size.height, 1.0));
And now it works :)
Apple should provide a list with Dos and Don'ts regarding the IB...
Upvotes: 3
Reputation: 2764
Interesting.
First, WeZZard's answer got me going in the right direction but wasn't exactly my solution.
In my iOS project, something had overridden the Runpath Search Paths
field in my target. It looked like this:
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
I tried his solution of adding the $(CONFIGURATION_BUILD_DIR)
but it didn't work for me. Since it wasn't working, out of habit I just deleted the configuration entry (going back to project defaults). When I did, it reset to this:
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
which if I dig into my xcconfig files, appears to come from the Cocoapods.
It seems same as Alex that the @loader_path
is key, but it's a slightly different path on iOS than it is Mac OS X.
Upvotes: 5
Reputation: 794
In my case, I was doing the next in the initWithFrame/initWithCoder methods to create the view:
className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
But It looks like I was not supposed to use the Main Bundle but the bundle of the class. So I replaced that code for the following and it worked:
bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];
I thought maybe this might help somebody.
Upvotes: 1
Reputation: 1215
for me it works to close xcode and reopen it again. No errors after. Thanks.
Upvotes: 13
Reputation: 1721
I had same problem In Xcode 6.4, adding Test target membership to the storyboard fixed these errors for me.
Also my test target has @loader_path/Frameworks
set in Runpath Search Paths
for test target, and not in original target.
Upvotes: 4