我正在尝试为我的所有观点提供一个名为newProperty
. 由于所有视图都会有它,因此将它添加到超类中会更有意义。在这种情况下,我想添加newProperty
以便UIView
所有UIView
子类(UIWindow
, UIPickerView
, UITabBar
, 等...)都将继承它。那么有可能吗?
2 回答
当您的属性需要支持实例变量时,您可以使用关联对象:
如何在对象内使用 objc_setAssociatedObject/objc_getAssociatedObject?
什么是 objc_setAssociatedObject() 以及在什么情况下应该使用它?
http://darkdust.net/writings/objective-c/attaching-objects
...但是您可能需要在使用它之前考虑一下。
当您的属性不需要实例变量时,请参阅 Luke 的回答。
在 UIView 上写一个类别。
在 Xcode 中,转到 File -> New -> File,然后从 iOS 部分的 Cocoa Touch 行中选择“Objective-C Category”。确保类别在 UIView 上,给它一个名字,然后你就走了。
从这里,您可以添加属性甚至实例方法,假设您在应用程序的前缀文件中导入类别,所有从 UIView 继承的类都可以访问。
编辑:我没有使用关联的对象。这是一个非常简单的示例,它使用对象中已经存在的预定义属性,使用我自己的属性来简化它们的检索。
OP 没有说明他们希望向 UIView 添加什么样的属性,这就是为什么我假设一个类别就足够了。我确信您对以下评论的看法都是正确的:真正自定义属性上的数据存储。
事实上,关于他们的“newProperty”的使用,OP 的目标还没有那么清楚,我不赞成投票。
例如:UIView 上的类别称为位置。(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