扩展UIView并在iOS中添加属性

时间:2013-12-04 10:28:26

标签: ios uiview extend

我想向UIView添加一个属性。 我知道我可以将UIView子类化,但是因为我想添加一个属性,我只想扩展它。

我试着这样:

@interface UIView (Util)
@property(nonatomic, assign) BOOL isShow;
@end

@implementation UIView (Util)
@dynamic isShow;

-(void)setIsShow:(BOOL)isShow{
    self.isShow = isShow;
}
@end

但它不起作用。它抛出异常:Thread 1: EXC_BAD_ACCESS(code=2,address,...)

2 个答案:

答案 0 :(得分:5)

如果您想在某个类别中添加新媒体资源,则必须使用objc_setAssociatedObjectobjc_getAssociatedObject

示例:

NSString *const IS_SHOW_KEY = @"IS_SHOW";

@interface UIView (Util)
@property (nonatomic) BOOL isShow;
@end

@implementation UIView (Util)

- (void)setIsShow:(BOOL)isShow {
    NSNumber *val = @(isShow);
    objc_setAssociatedObject(self, (__bridge const void*)(IS_SHOW_KEY), val, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)isShow {
    NSNumber *val = objc_getAssociatedObject(self, (__bridge const void*)IS_SHOW_KEY);
    return [val boolValue];
}

@end

请参阅此处的运行时参考文档:https://developer.apple.com/library/ios/documentation/cocoa/reference/ObjCRuntimeRef/Reference/reference.html

答案 1 :(得分:0)

您不应该通过类别添加属性 - 您只能添加方法。在这里阅读更多内容:

http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

然而,您可以通过创建设置/获取所需值的方法来实现所需。

@interface UIView (Util)
-(void)setIsShow:(BOOL)isShow;
@end

@implementation UIView (Util)
@dynamic isShow;

-(void)setIsShow:(BOOL)isShow{
    self.isShow = isShow;
}
@end

如果你真的需要属性,那么你需要继承