I'd like to subclass UIButton
to add some properties that i need (not methods... only properties).
Here the code of my subclass:
//.h----------------------- @interface MyButton : UIButton{ MyPropertyType *property; } @property (nonatomic,retain) MyPropertyType *property; @end //.m-------------------------- @implementation MyButton @synthesize property; @end
And here how I use the class:
MyButton *btn = ((MytButton *)[MyButton buttonWithType:UIButtonTypeRoundedRect]); btn.property = SomeDataForTheProperty;
From where i obtain this error :
-[UIRoundedRectButton setProperty:]: unrecognized selector sent to instance 0x593e920
Thus, from ButtonWithType
i obtain a UIRoundedRectButton
and (Mybutton *)
can't cast it... What i have to do to obtain a MyButton
object ? is -init
the unique solution ?
Thank you!
A control that executes your custom code in response to user interactions.
Try using a category with Associative References instead. It is much cleaner and will work on all instances of 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
//Example usage
#import "UIButton+Property.h" ... UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button1.property = @"HELLO"; NSLog(@"Property %@", button1.property); button1.property = nil; NSLog(@"Property %@", button1.property);
You need to do:
MyButton *btn = [[MyButton alloc] init];
To create your button. The buttonWithType:UIButtonTypeRoundedRect
only creates UIButton objects.
=== edit ===
If you wish to use a RoundedRect button; then I would suggest the following. Basically, we just create a UIView with whatever properties we want and add the desired button to that view.
@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];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With