setting new properties in category interface/implementation

后端 未结 7 1441
醉梦人生
醉梦人生 2020-12-03 03:42

Ok, so I have this, but it wont work:

@interface UILabel (touches)

@property (nonatomic) BOOL isMethodStep;

@end


@implementation UILabel (touches)

-(BOO         


        
相关标签:
7条回答
  • 2020-12-03 04:03

    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.

    0 讨论(0)
  • 2020-12-03 04:04

    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.

    0 讨论(0)
  • 2020-12-03 04:06

    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
    
    0 讨论(0)
  • 2020-12-03 04:17

    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]];
        }
    }
    
    0 讨论(0)
  • 2020-12-03 04:22

    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)
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-03 04:22

    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
    
    0 讨论(0)
提交回复
热议问题