使用UIButton传递多个标签

时间:2013-04-11 08:07:03

标签: ios objective-c uibutton

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

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

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

UIButton *clicked= (UIButton *) sender;

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

现在我想传递一个这样的独特属性。我正在制作这个,但这就是我设想的方式

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

问题可能措辞不多,但我不知道更好,所以我把它称为“标签”。(正确的措辞可能是元素/属性等)如何创建类似于.tag的类似属性?< / p>

非常感谢! 阿尔达

6 个答案:

答案 0 :(得分:3)

你想达到什么目的?

可以添加关联引用。关于这个的好处是,你不需要对它进行分类。因此,首先要为UIButton

创建一个类别
@interface UIButton (ExtraTag)

@property (nonatomic, retain) id extraTag;

@end

而.m:

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);
}

You can check the article I used

答案 1 :(得分:2)

在子类/自定义按钮中,您可以添加字符串属性,甚至可以添加整数属性,无论您感觉良好。

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

@end

然后您可以访问aButton.createdBy

答案 2 :(得分:2)

CALayer实际上允许Key-Value coding

你可以真正做到这一点(在任何 UI 对象上):

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

并阅读它只需使用

[button.layer valueForKey:@"tagCREATED_BY_ME"]

强制性的,以上就是你需要做到的所有事情,你很高兴。

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

如果您尚未为这些键分配任何内容,则需要这些键具有默认值...您可以设置这些自定义&#34;标记&#34; (eh)如果根据模式命名,则具有默认返回值。例如,我使用&#34; customKey _&#34;启动我的所有图层键名称&#39; s。所以上面的内容是@&#34; customKey_tagCREATED_BY_ME&#34;,然后你可以让你的.m文件返回任何标准键的默认键值,如masksToBounds,但是然后为你的键返回一个非常具体的值(又称使用以下方法以&#34; customKey _&#34;)开头的键:

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

您必须拥有命名模式(例如始终使用前缀&#34; customKey _&#34;)的原因是您不会干扰CALayer的自然属性,例如{{1}您想要返回的默认值只会在以&#34; customKey _&#34;开头的属性(键)上返回。或者你使用的任何命名模式。

答案 3 :(得分: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];
    // ...
}

Blog post about tags and associated references

答案 4 :(得分:0)

您可以继承UIButton

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

@property (strong, nonatomic) NSNumber *tagCREATED_BY_ME;

答案 5 :(得分:0)

您可以查看KVC

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