将属性添加到超类UIView

时间:2013-05-22 10:50:04

标签: objective-c oop inheritance

我正在尝试为我的所有观点提供一个名为newProperty的新属性。 由于所有视图都具有它,因此将它添加到超类更有意义。 在这种情况下,我想将newProperty添加到UIView,以便所有UIView子类(UIWindowUIPickerViewUITabBar等... )将继承它。 那有可能吗?

2 个答案:

答案 0 :(得分:3)

当您的属性需要支持实例变量时,您可以使用关联的对象:

How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?

What is objc_setAssociatedObject() and in what cases should it be used?

http://darkdust.net/writings/objective-c/attaching-objects

...但是在使用之前你可能想要考虑一下。

当你的财产不需要实例变量时,请参阅Luke的回答。

答案 1 :(得分:1)

在UIView上写一个类别。

在Xcode中,转到文件 - >新 - >单击文件,然后从iOS部分的Cocoa Touch行中选择“Objective-C Category”。确保该类别在UIView上,给它一个名字然后你就离开了。

从这里开始,您可以添加属性甚至实例方法,假设您在应用程序的前缀文件中导入类别,则从UIView继承的所有类都可以访问。

编辑:我没有使用过相关的对象。这是一个非常简单的示例,使用对象中已存在的预定义属性,使用我自己的属性来简化检索。

OP尚未说明他们希望向UIView添加什么样的属性,这就是为什么我假设一个类别就足够了。我确信您对下面的评论都是正确的:在真正的自定义属性上存储数据。

我不赞赏downvotes,事实上OP的目标尚未明确,关于他们的“newProperty”的使用。

例如:UIView上的类别名为Position。 (UIView的+位置)

UIView+Position.h

@interface UIView (Position)

-(CGFloat)left;
-(CGFloat)right;
-(CGFloat)top;
-(CGFloat)bottom;

@property (nonatomic) CGFloat left;
@property (nonatomic) CGFloat right;
@property (nonatomic) CGFloat top;
@property (nonatomic) CGFloat bottom;

@end



UIView+Position.m

#import "UIView+Position.h"

@implementation UIView (Position)

-(CGFloat)left
{
    return self.frame.origin.x;
}

-(CGFloat)right
{
    return self.frame.origin.x + self.frame.size.width;
}

-(CGFloat)top
{
    return self.frame.origin.y;
}

-(CGFloat)bottom
{
    return self.frame.origin.y + self.frame.size.height;
}

@end