無需創建子類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