Ok, so I have this, but it wont work:
@interface UILabel (touches)
@property (nonatomic) BOOL isMethodStep;
@end
@implementation UILabel (touches)
-(BOO
It seems as if since Xcode 7 (7.0.1, 7A1001), properties are supported in categories. I noticed that Xcode generates categories now for Core Data subclasses.
For example, I got the files:
Location+CoreDataProperties.h
#import "Location.h"
NS_ASSUME_NONNULL_BEGIN
@interface Location (CoreDataProperties)
@property (nullable, nonatomic, retain) NSNumber *altitude;
@property (nullable, nonatomic, retain) NSNumber *latitude;
@property (nullable, nonatomic, retain) NSNumber *longitude;
@end
NS_ASSUME_NONNULL_END
Location+CoreDataProperties.m
#import "Location+CoreDataProperties.h"
@implementation Location (CoreDataProperties)
@dynamic altitude;
@dynamic latitude;
@dynamic longitude;
@end
So looks like properties in categories might work now. I haven't tested on non-Core Data classes.
What I've noticed is that they do include the category file back into the original class:
Location.h
@interface Location : NSManagedObject
@end
#import "Location+CoreDataProperties.h"
This allows the original class to edit the properties specified by the category.
There is actually a way, which may not be ideal, but does work.
For it to work, you will need to create a category for a class X and can only be used on subclasses of the same X (e.g. category UIView (Background)
can be used with class MyView : UIView
, but not directly with UIView
)
// UIView+Background.h
@interface UIView (Background)
@property (strong, nonatomic) NSString *hexColor;
- (void)someMethodThatUsesHexColor;
@end
// UIView+Background.h
@implementation UIView (Background)
@dynamic hexColor; // Must be declared as dynamic
- (void)someMethodThatUsesHexColor {
NSLog(@"Color %@", self.hexColor);
}
@end
Then
// MyView.m
#import "UIView+Background.h"
@interface MyView : UIView
@property (strong, nonatomic) NSString *hexColor;
@end
@implementation MyView ()
- (void)viewDidLoad {
[super viewDidLoad];
[self setHexColor:@"#BABACA"];
[self someMethodThatUsesHexColor];
}
@end
Using this method, you will need to "redeclare" your properties, but after that, you can do all of its manipulation inside your category.
EDIT: Warning: This property would have a unique value for all the instances of the class.
This worked for me, but only because I had only one instance of this class in my app.
#import <AVFoundation/AVFoundation.h>
@interface AVAudioPlayer (AstroAVAudioPlayer)
@property (nonatomic) BOOL redPilot;
@end
#import "AVAudioPlayer+AstroAVAudioPlayer.h"
@implementation AVAudioPlayer (AstroAVAudioPlayer)
BOOL _redPilot;
-(void) setRedPilot:(BOOL)redPilot
{
_redPilot = redPilot;
}
-(BOOL) redPilot
{
return _redPilot;
}
@end
A solution that I found to this was to just give each object that you want flagged a unique tag.
I made a UILabel category to add custom fonts to all my labels but on some i wanted them to be bold so i did this ->
- (void) layoutSubviews {
[super layoutSubviews];
[self addCustomFont];
}
- (void) addCustomFont {
if (self.tag == 22) {
[self setFont:[UIFont fontWithName:SEGOE_BOLD size:self.font.pointSize]];
}else{
[self setFont:[UIFont fontWithName:SEGOE_LIGHT size:self.font.pointSize]];
}
}
Checked all answers and did not find the most common solution:
#import <objc/runtime.h>
static void const *key;
@interface ClassName (CategoryName)
@property (nonatomic) BOOL myProperty;
@end
@implementation ClassName (CategoryName)
- (BOOL)myProperty {
return [objc_getAssociatedObject(self, key) boolValue];
}
- (void)setMyProperty:(BOOL)value {
objc_setAssociatedObject(self, key, @(value), OBJC_ASSOCIATION_RETAIN);
}
@end
swift:
private struct AssociatedKeys {
static var keyName = "keyName"
}
extension Foo {
var bar: Any! {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.keyName)
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.keyName , newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
You could inject an associated object during runtime.
#import <objc/runtime.h>
@interface UIView (Private)
@property (nonatomic, assign) CGPoint initialTouchPoint;
@property (nonatomic, strong) UIWindow *alertWindow;
@end
@implementation UIView (Private)
@dynamic initialTouchPoint, alertWindow;
- (CGPoint)initialTouchPoint {
return CGPointFromString(objc_getAssociatedObject(self, @selector(initialTouchPoint)));
}
- (void)setInitialTouchPoint:(CGPoint)initialTouchPoint {
objc_setAssociatedObject(self, @selector(initialTouchPoint), NSStringFromCGPoint(initialTouchPoint), OBJC_ASSOCIATION_RETAIN);
}
- (void)setAlertWindow:(UIWindow *)alertWindow {
objc_setAssociatedObject(self, @selector(alertWindow), alertWindow, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIWindow *)alertWindow {
return objc_getAssociatedObject(self, @selector(alertWindow));
}
@end