2013-04-11 91 views
2

好的我有一个特定的情况。我使用的是自定义的类来创建一些按钮,我可以用喜欢的唯一号码设置它们的标签属性:通过UIButton传递多个标签

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

这是我的程序的其他部分非常有用,因为我可以访问此独特的标签,如:

UIButton *clicked= (UIButton *) sender; 

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

现在我想传递一个像这样的独特属性。我在做这件事,但是这是我想象它

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

的问题可能是措辞很差,但我不知道任何更好,所以我把它叫做“标签”。(正确写法可能是元素/属性等)如何创建类似的属性来像.tag一样运行?

非常感谢! arda

回答

2

在你的子类/自定义按钮,你可以添加任何一个你感觉良好的字符串属性甚至整数属性。

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

@end 

然后你就可以访问这些为aButton.createdBy

+1

这是非常简单的工作。这就是我一直在寻找的! – ardavar 2013-04-11 18:02:20

0

您可以继承UIButton

在你的子类,添加新的属性:

@property (strong, nonatomic) NSNumber *tagCREATED_BY_ME; 
0

你可以看看KVC

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

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

+0

真棒博客,谢谢! – Matt 2013-06-15 21:39:15

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

+0

好戏。我曾使用过这个,但我无法添加关联的密钥。谢谢。 – 2014-05-14 06:32:30

1

CALayer实际允许Key-Value coding

你可以从字面上只是这样做(在任何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]; 
} 

你必须有一个命名模式(像往常一样具有suffic“customKey_”)的原因是这样你就不会用的CALayer的自然属性interefere像.size.backgroundColor等。您返回的默认值只会返回到以“customKey_”开头的属性(键)或您使用的任何命名模式。