2013-04-08 69 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這種方式獲得按鈕標題名稱。 我們無法獲取變量名稱