我创建了一个名为TaskUIButton的自定义按钮,它继承自UIButton。我现在唯一的区别是“va”属性。
这是界面
// TaskUIButton.h
@interface TaskUIButton : UIButton
{
NSString *va;
}
@property(nonatomic, retain) NSString *va;
@end
和实施文件
//TaskUIButton.m
@implementation TaskUIButton
@synthesize va;
@end
现在,我有一个我正在使用的动作,我想用它来设置和检索按钮的va属性(当然只是用于测试/实验)。
这是按钮操作的位置
- (IBAction)setAndRetrieveVa:(id)sender{
TaskUIButton *imaButton = [TaskUIButton buttonWithType:UIButtonTypeRoundedRect];
imaButton.va = @"please work";
NSLog(@"%@", imaButton.va);
}
激活setAndRetrieveVa:操作后,我的应用程序崩溃了:
-[UIRoundedRectButton setVa:]: unrecognized selector sent to instance 0x4b3a5a0
我确信这对我来说是一个愚蠢的错误,但我已经有一段时间了,我会喜欢一些见解!
谢谢!
答案 0 :(得分:4)
你得到这个是因为buttonWithType:
正在返回一个新对象,它是UIRoundedRectButton
对象,是UIButton
的子类。您不能改变方法的这种行为,除非您覆盖但不太可能得到您想要的。你应该采用alloc-init
方法。
使用关联参考
您需要#import <Foundation/NSObjCRuntime.h>
才能实现此目的。
设置,
objc_setAssociatedObject(button, "va", @"This is the string", OBJC_ASSOCIATION_RETAIN);
要检索,
NSString * va = (NSString *)objc_getAssociatedObject(button, "va");
这样您就不需要继承UIButton
。
答案 1 :(得分:0)
我最终只是扩展了UIControl ...结果很简单:)
- (IBAction)setAndRetrieveVa:(id)sender{
TaskUIButton *newTaskButton = [[TaskUIButton alloc] initWithFrame:CGRectMake(29.0, (76.0+ (88*taskCounter)), 692, 80.0)];
[newTaskButton addTarget:self action:@selector(function1:)forControlEvents:UIControlEventTouchUpInside];
[newTaskButton addTarget:self action:@selector(function2:) forControlEvents:UIControlEventTouchDragExit];
[newTaskButton setBackgroundColor:[UIColor grayColor]];
[newTaskButton setTitle:@"0" forState:UIControlStateNormal];
[newTaskButton setVa:@"please work!"];
NSLog(@"%@", newTaskButton.va);
}
对于单击突出显示,我总是可以添加一个在触摸发生时更改背景颜色的功能,并在触摸发生时将颜色切换回来。乌拉!