在类别接口/实现中设置新属性

Tho*_*son 14 objective-c categories ios

好的,所以我有这个,但它不会工作:

@interface UILabel (touches)

@property (nonatomic) BOOL isMethodStep;

@end


@implementation UILabel (touches)

-(BOOL)isMethodStep {
    return self.isMethodStep;
}

-(void)setIsMethodStep:(BOOL)boolean {
    self.isMethodStep = boolean;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.isMethodStep){
        // set all labels to normal font:
        UIFont *toSet = (self.font == [UIFont fontWithName:@"Helvetica" size:16]) ? [UIFont fontWithName:@"Helvetica-Bold" size:16] : [UIFont fontWithName:@"Helvetica" size:16];

        id superView = self.superview;
        for(id theView in [(UIView *)superView subviews])
            if([theView isKindOfClass:[UILabel class]])
                [(UILabel *)theView setFont:[UIFont fontWithName:@"Helvetica" size:16]];

        self.font = toSet;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

如果我取出getter和setter方法然后它不起作用它告诉我我需要创建一些getter和setter方法(或者使用@synthesize - 但是在@implementation中放入@synthesize也会引发错误).但是使用getter和setter方法,我得到一个EXC_BAD_ACCESS和崩溃.有任何想法吗?谢谢

汤姆

Vik*_*ica 39

无法通过仅类别方法向现有类添加成员和属性.

https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

一种可能的解决方法是编写"setter/getter-like"方法,该方法使用单例来保存变量,这些变量本来就是成员.

-(void)setMember:(MyObject *)someObject
{
    NSMutableDictionary *dict = [MySingleton sharedRegistry];
    [dict setObject:someObject forKey:self];
}

-(MyObject *)member
{
    NSMutableDictionary *dict = [MySingleton sharedRegistry];
    return [dict objectforKey:self];
}
Run Code Online (Sandbox Code Playgroud)

或者 - 当然 - 编写一个继承自UILabel的自定义类


请注意,现在可以在运行时注入关联的对象.Objective C Programming Language:Associative References