Подкласс UIButton для добавления свойства
Я хотел бы подклассом UIButton
добавить некоторые свойства, которые мне нужны (а не методы... только свойства).
Здесь код моего подкласса:
//.h-----------------------
@interface MyButton : UIButton{
MyPropertyType *property;
}
@property (nonatomic,retain) MyPropertyType *property;
@end
//.m--------------------------
@implementation MyButton
@synthesize property;
@end
И вот как я использую класс:
MyButton *btn = ((MytButton *)[MyButton buttonWithType:UIButtonTypeRoundedRect]);
btn.property = SomeDataForTheProperty;
Откуда я получаю эту ошибку:
-[UIRoundedRectButton setProperty:]: unrecognized selector sent to instance 0x593e920
Таким образом, из ButtonWithType
я получаю a UIRoundedRectButton
и (Mybutton *)
не может использовать его...
Что я должен сделать, чтобы получить объект MyButton
? -init
единственное решение?
Спасибо!
Ответы
Ответ 1
Попробуйте вместо этого использовать категорию Ассоциативные ссылки. Он намного чище и будет работать во всех экземплярах UIButton
.
UIButton + Property.h
#import <Foundation/Foundation.h>
@interface UIButton(Property)
@property (nonatomic, retain) NSObject *property;
@end
UIButton + Property.m
#import "UIButton+Property.h"
#import <objc/runtime.h>
@implementation UIButton(Property)
static char UIB_PROPERTY_KEY;
@dynamic property;
-(void)setProperty:(NSObject *)property
{
objc_setAssociatedObject(self, &UIB_PROPERTY_KEY, property, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSObject*)property
{
return (NSObject*)objc_getAssociatedObject(self, &UIB_PROPERTY_KEY);
}
@end
//Пример использования
#import "UIButton+Property.h"
...
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button1.property = @"HELLO";
NSLog(@"Property %@", button1.property);
button1.property = nil;
NSLog(@"Property %@", button1.property);
Ответ 2
Вам нужно сделать:
MyButton *btn = [[MyButton alloc] init];
Чтобы создать свою кнопку. buttonWithType:UIButtonTypeRoundedRect
создает только объекты UIButton.
=== edit ===
Если вы хотите использовать кнопку RoundedRect; то я бы предложил следующее. В принципе, мы просто создаем UIView с любыми свойствами, которые хотим, и добавим желаемую кнопку в это представление.
.h
@interface MyButton : UIView
{
int property;
}
@property int property;
@end
.м
@implementation MyButton
@synthesize property;
- (id)initWithFrame:(CGRect)_frame
{
self = [super initWithFrame:_frame];
if (self)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = self.bounds;
[self addSubview:btn];
}
return self;
}
@end
Использование:
MyButton *btn = [[MyButton alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];
btn.property = 42;
[self.view addSubview:btn];
Ответ 3
У меня есть простая схема, которая включает только несколько методов библиотеки, без шаблона и всего лишь 3 строки кода для каждого свойства, которое вы хотите добавить. Ниже приведены два примера свойств: startPoint и tileState. Для иллюстративных целей здесь вы должны добавить строки для свойства типа tileState:
//@property (assign, nonatomic) SCZTileState tileState; // tileState line 1
//@property (assign, nonatomic) SCZTileState tileState; // tileState line 2
//@dynamic tileState; // tileState line 3
В моем сообщении более подробно описывается, как это работает
UIButton + SCZButton.h
#import <UIKit/UIKit.h>
@interface UIButton (SCZButton)
@property (readwrite, nonatomic) id assocData;
@end
UIButton + SCZButton.m
// UIButton+SCZButton.m
// Copyright (c) 2013 Ooghamist LLC. All rights reserved.
#import "UIButton+SCZButton.h"
#import <objc/runtime.h>
@implementation UIButton (SCZButton)
- (id)assocData {
id data = objc_getAssociatedObject(self, "SCZButtonData");
return data;
}
- (void)setAssocData:(id)data {
objc_setAssociatedObject(self, "SCZButtonData", data,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
OOGTotallyTile.h
// UIButton+OOGTotallyTile.m
// Copyright (c) 2013 Ooghamist LLC. All rights reserved.
#import <UIKit/UIKit.h>
#import "UIButton+SCZButton.h"
#define kPointLabelTag 837459
typedef enum {
SCZTileStatePlaced,
SCZTileStateDropping,
SCZTileStateDropped
} SCZTileState;
@interface SCZButtonData : NSObject
@property (assign, nonatomic) CGPoint startPoint;
@property (assign, nonatomic) SCZTileState tileState; // tileState line 1
@end
@interface UIButton (OOGTotallyTile)
@property (readonly, nonatomic) SCZButtonData *buttonData;
@property (assign, nonatomic) CGPoint startPoint;
@property (assign, nonatomic) SCZTileState tileState; // tileState line 2
@end
OOGTotallyTile.m
// UIButton+OOGTotallyTile.m
// Copyright (c) 2013 Ooghamist LLC. All rights reserved.
#import "OOGTotallyTile.h"
@implementation SCZButtonData
@end
@implementation UIButton (OOGTotallyTile)
@dynamic startPoint;
@dynamic tileState; // tileState line 3
- (SCZButtonData*)buttonData {
if ( ! self.assocData) {
self.assocData = [[SCZButtonData alloc] init];
}
return self.assocData;
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
id forwardingTarget = [super forwardingTargetForSelector:aSelector];
if ( ! forwardingTarget) {
return [self buttonData];
}
return forwardingTarget;
}
@end