无需创建子类UIButton
如果我们只是通过执行以下操作将我们只要创建一个新的类别的新属性为UIButton
一个全新的类:
的UIButton + properties_cat.h
#import <UIKit/UIButton.h>
#import <objc/runtime.h>
@interface UIButton (properties_cat)
@property (nonatomic, strong) NSString *nameTag;
@end
UIButton + properties_cat。^ h
#import "UIButton+properties_cat.h"
@implementation UIButton (properties_cat)
// We can't use synthesize with categories so we have to use dynamic.
@dynamic nameTag;
#pragma mark - Setters and Getters for nameTag Property
- (void)setNameTag:(NSString *)nameTag
{
objc_setAssociatedObject(self, @"nameTag", nameTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)nameTag
{
return objc_getAssociatedObject(self, @"nameTag");
}
@end
然后确保通过做#import "UIButton+properties_cat.h"
导入新的类到您的代码一旦我们有#imported
它,我们现在可以在课堂上使用它像这样
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setNameTag:@"my button name"];
注意我们仍在使用UIButton
而不是创建一个毫无意义的新课程,如MyButton
我们刚刚将新属性(nameTag
)添加到现有的UIButton
课程中。
UPDATE
这是基于另一个答案评论的更新。
因此,您希望能够访问您在另一种方法中完成的按钮?
好吧,让我们改进上面的代码。我们可以将nameTag
应用于UIButton
,而不是将其应用于UIButton
继承的UIView
。于是,这将允许我们申请nameTag
任何东西,从UIView
继承 - UILabel
,UIButton
等
我们也想实现一个名为viewWithName:
新方法,这将工作方式相同viewWithTag:
除了它会检查nameTag
代替tag
。
所以请尝试使用下面的代码:
的UIView + cat.h
#import <UIKit/UIView.h>
#import <objc/runtime.h>
@interface UIView (cat)
@property (nonatomic, strong) NSString *nameTag;
- (UIView *)viewWithName:(NSString *)name;
@end
的UIView + cat.m
#import "UIView+cat.h"
@implementation UIView (cat)
@dynamic nameTag;
#pragma mark - viewWithName: method
- (UIView *)viewWithName:(NSString *)name
{
for(id view in [self subviews]) {
// This if statement checks that the view is an instance of UIView class
// or inherits from it, so it should return true if like UILabel.
if([view isKindOfClass:[UIView class]]) {
if([[view nameTag] isEqualToString:name]) {
// This will return the first view that it comes across with the nameTag that equals name
return view;
}
}
}
return nil;
}
#pragma mark - Setters and Getters for nameTag Property
- (void)setNameTag:(NSString *)nameTag
{
objc_setAssociatedObject(self, @"nameTag", nameTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)nameTag
{
return objc_getAssociatedObject(self, @"nameTag");
}
@end
现在,而不是导入UIButton+properties_cat.h
我们需要导入UIView+cat.h
这是因为我们不需要创建UIButton+properties_cat.h
,因为UIButton
继承自UIView
所以它不会我选择新的属性和方法。
所以一旦我们导入UIView+cat.h
我们就可以设置我们UIButton
nameTag
像:
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setNameTag:@"my button name"];
然后在另一种方法,我们希望访问按钮,我们可以做
UIButton *btn = (UIButton *)[[self view] viewWithName:@"my button name"];
我们增加因为viewWithName:
将会返回一个UIView
我们想确保它是UIButton
的一个实例。在Customizing Classes with Categories
如果您需要任何更多的只是问
更多信息。
'NSDictionary'? – 2013-12-10 10:58:39