用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一个属性。