Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subclass UIButton to add a property

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!

like image 710
MatterGoal Avatar asked Mar 31 '11 13:03

MatterGoal


People also ask

What is UIButton in swift?

A control that executes your custom code in response to user interactions.


2 Answers

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); 
like image 157
Joe Avatar answered Oct 09 '22 05:10

Joe


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.


.h

@interface MyButton : UIView {     int property; }  @property int property; @end 

.m

@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 

Usage:

MyButton *btn = [[MyButton alloc] initWithFrame:CGRectMake(0, 0, 200, 20)]; btn.property = 42;  [self.view addSubview:btn]; 

like image 31
Wex Avatar answered Oct 09 '22 05:10

Wex