在Objective-C中检索自定义按钮属性

时间:2011-06-07 19:51:53

标签: objective-c button properties

我创建了一个名为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

我确信这对我来说是一个愚蠢的错误,但我已经有一段时间了,我会喜欢一些见解!

谢谢!

2 个答案:

答案 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);
}

对于单击突出显示,我总是可以添加一个在触摸发生时更改背景颜色的功能,并在触摸发生时将颜色切换回来。乌拉!