2013-04-08 68 views
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]; 
} 

现在的按钮被按下以标题为“一”,我想要得到的变量名为“buttonOne”,同样与标题按钮被按下“二”我想要得到的变量名“buttonTwo”。

我没有找到获取变量名的方法。任何帮助?在此先感谢

+1

你想通过查找变量名称来做什么? – Pratik 2013-04-08 12:45:47

+0

你对标准的目标行动设计模式有什么看法? – 2013-04-08 12:47:23

+0

为调试目的,因为宏被用于设置文本,框架等无处不在,所以如果有办法获得变量名称,那么将有所帮助 – 2013-04-08 12:47:57

回答

1

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

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

+0

工作正常。还必须导入。正如你所说,按钮应该是属性,而不是用于这个逻辑工作的局部变量。我纯粹仅用于调试目的。谢谢 – 2013-04-09 05:41:20

0

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