好的我有具体的情况。我使用自定义类来创建一些按钮,我可以使用唯一的数字设置其标签属性,如:
button.tag =[NSNumber numberWithInt:[10]];
这在我的程序的另一部分非常有用,因为我可以访问这个唯一标记,如:
UIButton *clicked= (UIButton *) sender;
ButtonTag = [NSString stringWithFormat:@"%d", clicked.tag];
现在我想传递一个这样的独特属性。我正在制作这个,但这就是我设想的方式
button.tagCREATED_BY_ME =[NSNumber numberWithInt:[9000]];
问题可能措辞不多,但我不知道更好,所以我把它称为“标签”。(正确的措辞可能是元素/属性等)如何创建类似于.tag的类似属性?< / p>
非常感谢! 阿尔达
答案 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);
}
答案 1 :(得分:2)
在子类/自定义按钮中,您可以添加字符串属性,甚至可以添加整数属性,无论您感觉良好。
@interface CustomButton: ....
...
@property(strong) NSString *createdBy;
@end
然后您可以访问aButton.createdBy
答案 2 :(得分:2)
你可以真正做到这一点(在任何 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];
// ...
}
答案 4 :(得分:0)
您可以继承UIButton
。
在您的子类中,添加一个新属性:
@property (strong, nonatomic) NSNumber *tagCREATED_BY_ME;
答案 5 :(得分:0)
您可以查看KVC。
或者如果你想坚持KISS原则 - 继承UIButton并创建一个属性。