您好,匿名用户
随意问技术百科期待您的加入

UIButton自定义属性

+1 投票

我要给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

难道这样扩展属性不对么?

用户头像 提问 2012年 12月1日 @ 随意问站长 上等兵 (310 威望)
分享到:

1个回答

+1 投票
 
最佳答案

你代码中虽继承了UIbutton重写了init,但是未重写buttonWithType:,所以在调用[MyUIButton buttonWithType:UIButtonTypeRoundedRect]时实际上调用了父类的buttonWithType:,父类的buttonWithType:调用了某种UIButtoninit

为什么我说是某种UIButton?因为UIButtonbuttonWithType:可以生成不同类型的对象,这些对象都是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
楼主,还是那句话,加强下面向对象的学习

用户头像 回复 2012年 12月1日 @ Pikachu 上等兵 (475 威望)
选中 2012年 12月1日 @随意问站长
提一个问题:

相关问题

+1 投票
1 回复 92 阅读
用户头像 提问 2012年 12月1日 @ Ezreal 上等兵 (266 威望)
0 投票
1 回复 47 阅读
0 投票
0 回复 17 阅读
用户头像 提问 2013年 12月15日 @ Udyr 上等兵 (341 威望)
0 投票
1 回复 27 阅读
用户头像 提问 2013年 12月30日 @ Gemini 上等兵 (319 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...