1

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

4

2 回答 2

3

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

如何在对象内使用 objc_setAssociatedObject/objc_getAssociatedObject?

什么是 objc_setAssociatedObject() 以及在什么情况下应该使用它?

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

...但是您可能需要在使用它之前考虑一下。

当您的属性不需要实例变量时,请参阅 Luke 的回答。

于 2013-05-22T10:54:07.403 回答
1

在 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
于 2013-05-22T10:54:45.567 回答