How to set default values for IBInspectable in Objective-C?

Objective CXcodeSwiftInterface BuilderIbinspectable

Objective C Problem Overview


I know default values of IBInspectable-properties can be set as:

@IBInspectable var propertyName:propertyType = defaultValue in Swift. But how do I achieve a similar effect in Objective-C so that I can have default value of some property set to something in Interface Builder?

Objective C Solutions


Solution 1 - Objective C

Since IBInspectable values are set after initWithCoder: and before awakeFromNib:, you can set the defaults in initWithCoder: method.

@interface MyView : UIView
@property (copy, nonatomic) IBInspectable NSString *myProp;
@property (assign, nonatomic) BOOL createdFromIB;
@end

@implementation MyView

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self != nil) {
        self.myProp = @"foo";
        self.createdFromIB = YES;
    }
    return self;
}

- (void)awakeFromNib {
    if (self.createdFromIB) {
        //add anything required in IB-define way
    }
    NSLog(@"%@", self.myProp);
}

@end

Solution 2 - Objective C

I wrote my code like this. It works pretty well for me, both when designing in the interface builder or running as a app.

@interface MyView : UIView

@property (copy, nonatomic) IBInspectable propertyType *propertyName;

@end

- (void)makeDefaultValues {
	_propertyName = defaultValue;
	//Other properties...
}

- (instancetype)initWithFrame:(CGRect)frame {
	if (self = [super initWithFrame:frame]) {
		[self makeDefaultValues];
	}
	return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
	if (self = [super initWithCoder:aDecoder]) {
		[self makeDefaultValues];
	}
	return self;
}

Solution 3 - Objective C

I'm using like that

@IBInspectable var propertyNameValue:propertyType?
var propertyName:propertyType { return propertyNameValue ?? defaultValue }

if propertyNameValue has nil, propertyName will return defaultValue.

Solution 4 - Objective C

Why don't use use the macro such as:

#if TARGET_INTERFACE_BUILDER   
// .....IB only specific code when being rendered in IB 
#endif 

???

The prepareForInterfaceBuilder selector may also help you to implement IB specific code.

More info about those 2 points here:
https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/chapters/CreatingaLiveViewofaCustomObject.html

Solution 5 - Objective C

Firstly I tried to override getter and did something like this:

- (UIColor *)borderColor {
    return _borderColor ?: [UIColor greenColor];
}

But in that case I received issue about undeclared identifier _borderColor.

Ok, I tried to avoid this issue via custom getter.

- (UIColor *)getBorderColor {
    return _borderColor ?: [UIColor greenColor];
}

Actually it's not a proper getter, as we don't point this method as getter. In case we point we'll receive issue about undeclared identifier, that's why we won't.

Then we use this method for getting property value in updateUI method.

Also we have to override setter:

- (void)setBorderColor:(UIColor *)borderColor {
  _borderColor = borderColor;
  [self updateUI];
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCan PoyrazoğluView Question on Stackoverflow
Solution 1 - Objective CrintaroView Answer on Stackoverflow
Solution 2 - Objective CGetToSetView Answer on Stackoverflow
Solution 3 - Objective CWanbok ChoiView Answer on Stackoverflow
Solution 4 - Objective CyonelView Answer on Stackoverflow
Solution 5 - Objective CkaspartusView Answer on Stackoverflow