我创建了一个简单的iPhone屏幕,其中包含两个UIButtons,如下所示。
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *buttonOne = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonOne.frame = CGRectMake(60, 70, 200, 40);
[buttonOne setTitle:@"One" forState:UIControlStateNormal];
[self.view addSubview:buttonOne];
UIButton *buttonTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonTwo.frame = CGRectMake(60, 250, 200, 40);
[buttonTwo setTitle:@"Two" forState:UIControlStateNormal];
[self.view addSubview:buttonTwo];
}
现在按下标题为“One”的按钮,我想将变量名称设为“buttonOne”,同样按下标题为“Two”的按钮,我想将变量名称设为“buttonTwo”。
我找不到获取变量名的方法。有帮助吗?提前致谢
答案 0 :(得分:1)
首先,我想声称这不是一个好的编码风格。我假设你这样做是因为某些特殊/独特的案例,或者作为概念证明。在生产应用程序中,这不是可行的方法。您应该将按钮设置为属性/ ivars,并且可以在按下它们时进行比较,也可以为每个按钮分配标签或单独的目标/选择器。你可以做些什么来避免这种方法是好的,因为老实说这种方法有点糟糕(参见下一段末尾关于nil / 0值的说明)。
您可以从之前的SO答案中查看以下代码 - 它将返回给定指针的ivar名称。但是,您必须将按钮声明为ivars而不是局部变量。此外,如果两个ivars为零,它将报告相同的情况。因此,只有当所有对象ivars都不为nil且原始类型ivars不为0时,这才有效。
#import <objc/objc.h>
- (NSString *)nameOfIvar:(id)ivarPtr
{
NSString *name = nil;
uint32_t ivarCount;
Ivar *ivars = class_copyIvarList([self class], &ivarCount);
if(ivars)
{
for(uint32_t i=0; i<ivarCount; i++)
{
Ivar ivar = ivars[i];
id pointer = object_getIvar(self, ivar);
if(pointer == ivarPtr)
{
name = [NSString stringWithUTF8String:ivar_getName(ivar)];
break;
}
}
free(ivars);
}
return name;
}
所以添加方法buttonPressed:
如下:
- (void)buttonPressed:(id)sender {
if ([sender isKindOfClass:[UIButton class]]) {
NSString *buttonName = [self nameOfIvar:sender];
//Now you can do something with your button name
}
}
第一段代码的来源:Get property name as a string
答案 1 :(得分:0)
我们只能通过这种方式获得按钮标题名称buttonOne.titleLabel.text。 我们无法获得变量名称