0

我以编程方式创建了一个带有两个 UIButton 的简单 iPhone 屏幕,如下所示。

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

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

4

2 回答 2

1

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

您可以从之前的 SO 答案中查看下面的代码 - 它将返回给定指针的 ivar 的名称。但是,您必须将按钮声明为 ivars 而不是局部变量。此外,如果两个 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
     }
}

第一个代码块的来源:以字符串形式获取属性名称

于 2013-04-08T13:05:52.487 回答
0

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

于 2013-04-08T12:55:16.833 回答