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