【发布时间】:2013-05-22 10:50:03
【问题描述】:
我正在尝试将我的所有观点提供一个名为newProperty 的新属性。
由于所有视图都会有它,因此将它添加到超类中会更有意义。
在这种情况下,我想将newProperty 添加到UIView,以便所有UIView 子类(UIWindow、UIPickerView、UITabBar 等)都将继承它。
那么有可能吗?
【问题讨论】:
标签: objective-c oop inheritance
我正在尝试将我的所有观点提供一个名为newProperty 的新属性。
由于所有视图都会有它,因此将它添加到超类中会更有意义。
在这种情况下,我想将newProperty 添加到UIView,以便所有UIView 子类(UIWindow、UIPickerView、UITabBar 等)都将继承它。
那么有可能吗?
【问题讨论】:
标签: objective-c oop inheritance
当您的属性需要支持实例变量时,您可以使用关联对象:
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 的回答。
【讨论】:
在 UIView 上写一个类别。
在 Xcode 中,转到 File -> New -> File,然后从 iOS 部分的 Cocoa Touch 行中选择“Objective-C Category”。确保类别在 UIView 上,给它一个名称,然后你就离开了。
从这里,您可以添加属性甚至实例方法,假设您在应用的前缀文件中导入类别,所有从 UIView 继承的类都可以访问。
编辑:我没有使用关联的对象。这是一个非常简单的示例,它使用对象中已经存在的预定义属性,使用我自己的属性来简化它们的检索。
OP 没有说明他们希望向 UIView 添加什么样的属性,这就是为什么我假设一个类别就足够了。我敢肯定你对下面的 cmets 都是正确的:真正自定义属性上的数据存储。
实际上,关于他们的“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
【讨论】: