2

好的,我有一个具体的情况。我正在使用自定义类来创建一些按钮,并且可以使用唯一的数字设置它们的标签属性,例如:

button.tag =[NSNumber numberWithInt:[10]];

这在我程序的另一部分非常有用,因为我可以访问这个独特的标签,例如:

UIButton *clicked= (UIButton *) sender;

ButtonTag = [NSString stringWithFormat:@"%d", clicked.tag];

现在我想再传递一个像这样的独特属性。我正在编造这个,但这就是我的设想

button.tagCREATED_BY_ME =[NSNumber numberWithInt:[9000]];

这个问题可能措辞不好,但我不知道更好,所以我称之为“标签”。(正确的措辞可能是元素/属性等)我如何创建一个类似的属性来像.tag一样工作?

非常感谢!阿尔达

4

6 回答 6

3

你想达到什么目标?

有可能添加关联引用。这样做的好处是您不需要对它进行子类化。因此,首先为以下内容创建一个类别UIButton

@interface UIButton (ExtraTag)

@property (nonatomic, retain) id extraTag;

@end

还有他们:

static char const * const ExtraTagKey = "ExtraTag";

@implementation UIButton (ExtraTag)
@dynamic extraTag;

- (id)extraTag {
    return objc_getAssociatedObject(self, ExtraTagKey);
}

- (void)setExtraTag:(id)newExtraTag {
    objc_setAssociatedObject(self, ExtraTagKey, newExtraTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

您可以查看我使用的文章

于 2013-04-11T08:18:07.150 回答
3

CALayer实际上允许Key-Value 编码。

您实际上可以这样做(在任何UI对象上):

[button.layer setValue:@(9000) forKey:@"tagCREATED_BY_ME"];

并阅读它只是使用

[button.layer valueForKey:@"tagCREATED_BY_ME"]




强制性的,以上就是您启动和运行所需的全部内容,您可以开始了。

对于其他人,更高级的/或/特定的东西如下:

如果您需要这些键在尚未分配任何内容时具有默认值...如果您根据模式命名它们,则可以将这些自定义“标签” eh )设置为具有默认返回值。例如,我以“customKey_”开头所有图层键名称。所以上面应该是@“customKey_tagCREATED_BY_ME”,然后你可以让你的 .m 文件返回任何标准键的默认键值,masksToBounds但然后为你的键(也就是以“customKey_”开头的键)返回一个非常具体的值以下方法:

+(id)defaultValueForKey:(NSString *)key {
    if ([key hasPrefix:@"customKey_"]) {
        return @(0);
    }
    return [CALayer defaultValueForKey:key];
}

你必须有一个命名模式(比如总是有前缀“customKey_”)的原因是你不会干扰 CALayer 的自然属性,比如.sizeand.backgroundColor等。你想要返回的默认值只会在属性上返回(键) 以“customKey_”或您使用的任何命名模式开头。

于 2016-05-19T21:37:20.967 回答
2

在您的子类/自定义按钮中,您可以添加一个字符串属性,甚至是一个整数属性,无论您感觉如何。

@interface CustomButton: ....
       ...
       @property(strong) NSString *createdBy;

@end

然后你可以访问那些aButton.createdBy

于 2013-04-11T08:13:14.927 回答
1

您还可以使用关联引用而不是标签操作

#import <objc/runtime.h>

static char kThumbnailButtonAssociatedPhotoKey;

// ...

- (void)setAssociatedPhoto:(Photo *)associatedPhoto
        forThumbnailButton:(UIButton *)thumbnailButton
{
    objc_setAssociatedObject(thumbnailButton,
                             &kThumbnailButtonAssociatedPhotoKey,
                             associatedPhoto,
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (Photo *)associatedPhotoForThumbnailButton:(UIButton *)thumbnailButton
{
    return objc_getAssociatedObject(thumbnailButton,
                                    &kThumbnailButtonAssociatedPhotoKey);
}

现在我们可以轻松地设置/获取按钮的关联照片:

- (void)configureThumbnailButtonForPhoto:(Photo *)photo
{
    // ...
    [self setAssociatedPhoto:photo
          forThumbnailButton:thumbnailButton];
    // ...
}

- (void)thumbnailButtonTapped
{
    Photo *photo = [self associatedPhotoForThumbnailButton:thumbnailButton];
    // ...
}

关于标签和相关参考的博客文章

于 2013-04-11T08:17:05.040 回答
0

您可以查看KVC

或者,如果您想坚持 KISS 原则 - 继承 UIButton 并创建一个属性。

于 2013-04-11T08:15:12.230 回答
0

您可以子类化UIButton.

在您的子类中,添加一个新属性:

@property (strong, nonatomic) NSNumber *tagCREATED_BY_ME;
于 2013-04-11T08:12:47.960 回答