【问题标题】:How to get instance variable name?如何获取实例变量名?
【发布时间】:2013-03-30 13:12:09
【问题描述】:

我以编程方式创建了一个带有两个 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”。

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

【问题讨论】:

  • 你想通过查找变量名来做什么?
  • 您对标准的目标-动作设计模式有何看法?
  • 用于调试目的,因为宏在任何地方都被用于设置文本、框架等,所以如果有办法获取变量名,那将会很有帮助
  • 无法获取变量名,但可以设置按钮标签,从标签中可以找到点击了哪个按钮。
  • 设置按钮标签是我在发布问题之前发现的,但是在一个已经完成大量编码的大型项目中,不可能为每个 UIControl 设置标签。我以 UIButton 为例来描述目的。

标签: iphone ios ipad uiview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先我要声明这不是好的编码风格。我假设您这样做是因为一些特殊/独特的情况,或者作为概念证明。在生产应用程序中,这不是要走的路。您应该将您的按钮设置为属性/变量,并且您可以在按下它们时比较它们,或者您可以分配标签,或者为每个按钮单独的目标/选择器。您可以采取任何措施来避免这种方法,因为老实说这种方法有点糟糕(请参阅下一段末尾关于 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
         }
    }
    

    第一段代码来源:Get property name as a string

    【讨论】:

    • 工作正常。还必须导入 。正如你所说,按钮应该是属性,而不是这个逻辑工作的局部变量。我仅将其用于调试目的。谢谢
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2021-03-28
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多