objective-c - 在类别接口(interface)/实现中设置新属性

标签 objective-c ios categories

好的,我有这个,但它不起作用:

@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

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

汤姆

最佳答案

无法通过类别将成员和属性添加到现有类 — 只有方法。

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];
}

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


请注意,现在可以在运行时注入(inject)关联对象The Objective C Programming Language: Associative References

关于objective-c - 在类别接口(interface)/实现中设置新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098753/

相关文章:

java - Junit 4.11 参数化和分类方法

ios - UIBarButtonItem 设计更改第一次不起作用,但第二次不起作用

iphone - 如何修复 iOS 中的视频方向问题

ios - 在 Swift 中子类化 NSObject - 初始化器的最佳实践

ios - 将 JSON 字符串解析为基于 iOS 类的对象

r - 有没有办法根据行在 R 中的值来选择和按比例分配行?

php - 类别和子类别的递归函数

ios - Tesseract OCR iOS 检测手写表单中的文本并使用文本自动填充在线表单

objective-c - 类工厂方法实现

android - React Native 测试 404 网络图像