如何获取实例变量名



我创建了一个简单的iPhone屏幕,其中有两个ui按钮,如下图所示。

- (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"。

我没有找到获得变量名称的方法。任何帮助吗?提前感谢

首先,我想否认这不是一个好的编码风格。我认为你这样做是因为一些特殊/独特的情况,或作为一个概念的证明。在生产应用程序中,这不是要走的路。你应该把你的按钮设置为属性/变量,当它们被按下时,你可以比较它们,或者你可以为每个按钮分配标签,或单独的目标/选择器。任何可以避免这种方法的方法都是好的,因为老实说,这种方法有点可怕(参见下一段关于nil/0值的注释)。

您可以从前面的SO答案中查看下面的代码-它将返回给定指针的ivar的名称。但是,必须将按钮声明为ivars而不是局部变量。同样,如果两个变量为nil,它将报告相同的结果。所以这只会在你所有的对象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
     }
}

第一个代码块的来源:获取属性名作为字符串

我们可以通过这种方式获得按钮标题名称buttonOne.titleLabel.text。我们无法得到变量名

最新更新