如何获取实例变量名称?

时间:2013-04-08 12:43:38

标签: iphone ios ipad uiview

我创建了一个简单的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”。

我找不到获取变量名的方法。有帮助吗?提前致谢

2 个答案:

答案 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。  我们无法获得变量名称