2013-04-08 3 views
0

아래와 같이 프로그래밍 방식으로 두 개의 UIButton이있는 간단한 iPhone 화면을 만들었습니다. "2"나는 변수 이름을 얻기 위해 원하는인스턴스 변수 이름을 얻는 방법은 무엇입니까?

- (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"로 변수 이름을 얻으려면 "버튼 2".

변수 이름을 가져 오는 방법을 찾지 못했습니다. 어떤 도움이 필요합니까? 미리 감사드립니다

+1

변수 이름을 찾고 싶습니까? – Pratik

+0

표준 타켓 - 액션 디자인 패턴과 비교했을 때 어떤 점이 있습니까? –

+0

디버깅 목적으로 매크로를 사용했기 때문에 텍스트, 프레임 등을 설정하는 데 매크로가 사용되었으므로 변수 이름을 얻는 방법이 있으면 도움이 될 것입니다 –

답변

1

먼저 좋은 코딩 스타일이 아니라는 점을 부인합니다. 특별한/독특한 케이스 때문에 또는 개념 증명으로 당신이 이것을하고 있다고 가정합니다. 프로덕션 앱에서는 이것이 불가능합니다. 단추를 속성/ivars로 설정하고 단추를 눌렀을 때 단추를 비교하거나 태그를 지정하거나 각 단추의 대상/선택기를 구분할 수 있습니다. 이 접근 방식을 피하기 위해 할 수있는 일은 좋다. 솔직히 말해서이 접근법은 끔찍하다 (다음 단락 끝에 nil/0 값에 대한 설명을 참고하기 바란다).

아래 코드를 이전 SO 응답에서 체크 아웃 할 수 있습니다. 포인터가있는 아이 바르의 이름을 반환합니다. 그러나 버튼을 지역 변수가 아닌 ivars로 선언해야합니다. 또한 두 개의 ivars가 nil 인 경우 동일하게보고합니다. 그래서 모든 객체의 인스턴스 변수는 nil이 아닌 경우에만 작동하고, 원시 형 인스턴스 변수는 다음과 같이 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

우리는 이런 식으로 buttonOne.titleLabel.text로만 버튼 제목을 얻을 수 있습니다. 변수 이름을 가져올 수 없습니다.

관련 문제