我要给UIButton自定义一个属性,我这样做的
MyUIButton.h
@interface MyUIButton : UIButton{
NSString *idx;
}
@property (nonatomic,retain) NSString *idx;
@end
MyUIButton.m
@implementation MyUIButton @synthesize idx; @end
#import "MyUIButton.h"
MyUIButton *btn = ((MyUIButton *)[MyUIButton buttonWithType:UIButtonTypeRoundedRect]);
btn.idx = @"abcd";
然后报错了:
-[UIRoundedRectButton setIdx:]: unrecognized selector sent to instance 0x816b2a0
难道这样扩展属性不对么?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你代码中虽继承了UIbutton重写了init,但是未重写buttonWithType:,所以在调用
[MyUIButton buttonWithType:UIButtonTypeRoundedRect]时实际上调用了父类的buttonWithType:,父类的buttonWithType:调用了某种UIButton的init。为什么我说是
某种UIButton?因为UIButton的buttonWithType:可以生成不同类型的对象,这些对象都是UIButton的子类。(当然不可能生成MyUIButton类型的对象,也就无法响应setIdx:方法)实际上,UIButton是一种
聚类,你不能直接继承它。应当增加扩展,使用运行时增加关联对象。注意.m中引入了#import <objc/runtime.h>:
@interface UIButton (IdxProperty) @property (nonatomic,retain) NSString *idx; @end #import <objc/runtime.h> @implementation MyUIButton @dynamic idx; @end - (NSString *)idx { NSString *idx = objc_getAssociatedObject(self, @"kUIButtonIdxKey"); return idx; } - (void)setIdx:(NSString *)idx { objc_setAssociatedObject(self, @"kUIButtonIdxKey", idx, OBJC_ASSOCIATION_RETAIN); }更干净的写法是给
@"kUIButtonIdxKey"加个宏。此处我写的有点dirty楼主,还是那句话,加强下面向对象的学习
-(id)buttonWithType:(UIButtonType)type { [super buttonWithType:type]; self.idx = @"abcd"; }