2013-04-08 4 views
0

Я создал простой экран iPhone с двумя UIButtons программно, как показано ниже.Как получить имя переменной экземпляра?

- (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», аналогично по нажатию кнопки с названием, как «Два» Я хочу, чтобы получить имя переменной, как "buttonTwo".

Я не нахожу способ получить имя переменной. Любая помощь? Заранее спасибо

+1

что вы хотите сделать, найдя переменное имя? – Pratik

+0

Что у вас против стандартного шаблона целевого действия? –

+0

для цели отладки, так как Macro используется везде для установки текста, фрейма и т. Д., Поэтому, если есть способ получить имя переменной, тогда будет полезно –

ответ

1

Прежде всего, я хотел бы сказать, что это не очень хороший стиль кодирования. Я предполагаю, что вы делаете это из-за какого-то особого/уникального случая или в качестве доказательства концепции. В производственном приложении это НЕ путь. Вы должны установить свои кнопки в качестве свойств/ivars, и вы можете сравнить их при нажатии, или вы можете назначить теги или отдельные цели/селектора для каждой кнопки. Все, что вы можете сделать, чтобы избежать такого подхода, хорошо, потому что, честно говоря, этот подход выглядит ужасно (см. Примечание в конце следующего абзаца о значениях nil/0).

Вы можете проверить этот код ниже из предыдущего ответа SO - он вернет имя ivar с учетом указателя. Однако вы должны объявлять свои кнопки как 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

Работает отлично. Имейте также импорт . Как вы сказали, кнопки должны быть свойствами, а не локальными переменными, чтобы эта логика работала. Я использую это только для целей отладки. благодаря –

0

мы можем получить только название названия кнопки таким образом кнопкаOne.titleLabel.text. мы не можем получить имя переменной

Смежные вопросы