用UIButton传递多个标签

好的,我有一个特定的情况。 我正在使用自定义类创build一些button,我可以设置他们的标签属性与唯一的数字,如:

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

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

 UIButton *clicked= (UIButton *) sender; ButtonTag = [NSString stringWithFormat:@"%d", clicked.tag]; 

现在我想要传递一个更独特的属性,就像这样。 我正在做这个,但这是我设想的

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

问题可能是措辞不佳,但我不知道更好,所以我把它称为“标记”(正确的措辞可能是元素/财产等)如何创build一个类似的属性function就像.tag?

非常感谢! 阿尔达

在你的子类/自定义button中,你可以添加一个string属性,甚至是一个整数属性,无论你感觉不错。

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

那么你可以访问那些作为aButton.createdBy

你想达到什么目的?

有可能添加关联引用。 关于这个的好处是,你不需要分类。 所以,开始为UIButton创build一个类别:

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

你可以检查我使用的文章 。

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

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

现在我们可以轻松设置/获取button的相关照片:

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

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

CALayer实际上允许键值编码 。

你可以从字面上做到这一点(在任何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的自然属性,比如.backgroundColor.backgroundColor等等。你所返回的默认值只会被返回以“customKey_”开头的属性(键)或您使用的任何命名模式。

你可以UIButton

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

 @property (strong, nonatomic) NSNumber *tagCREATED_BY_ME; 

你可以看看KVC 。

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