2009-05-25 2 views
3

의 인스턴스를 확인하려면 다음문자열의 값을 사용하여 나는이 유사한 switch 문이 클래스

switch (number) 
    { 
     case 1: 
      if (imageView1.hidden == NO) 
      { 
       imageView1.hidden = YES;      

      } else 
      { 
       imageView1.hidden = NO; 
      } 


      break; 
     case 2: 
      if (imageView2.hidden == NO) 
      { 
       imageView2.hidden = YES; 


      } else 
      { 
       imageView2.hidden = NO; 
          } 

      break; 

등등 등등을.

내 질문은 "imageView1"이라는 값이있는 문자열을 사용하여 이미지 뷰의 각 인스턴스마다 다른 대소 문자를 사용하는 대신 imageView 클래스의 인스턴스에 액세스하는 방법입니다. 나는 뮤즈가 문자열이나 그와 비슷한 것으로부터 NSPath를 만드는 것과 비슷하지만, 어디에서 보는지, 또는 무엇을 부를지 확신하지 않는다.

미리 도움을 청하십시오!

+2

저는 Objective-C를 잘 모르지만, 이것은 나쁜 디자인을 비명 지릅니다. 실제 인스턴스 변수를 전달하는 방법을 알아야하므로 문자열이 필요하지 않습니다. –

+1

이 동의했습니다. 일반적으로 switch 문은 "다형성"을 소리내는 코드 냄새입니다.이 경우 판단 할 수있는 컨텍스트가 충분하지 않습니다. –

답변

5

,

iview.hidden = ! iview.hidden; 

:

NSArray *views = [NSArray arrayWithObjects: imageView1, imageView2, nil]; 
NSImageView *iview = [views objectAtIndex: number]; 

또한, 같은 것을 고려할 수 실제로 코드입니다. 그러나 귀하가 질문의 일반화 된 버전만을 게시하고 있다고 가정하겠습니다. 그리고 이것이 Objective-C의 중요한 개념이기 때문에 우리는 그것에 대해 이야기해야합니다.

키 값 코딩과 루틴 -valueWithKey:을 사용하여 이름으로 개체의 속성에 액세스 할 수 있습니다.

NSString *nameOfView = @"imageView1"; 
[[self valueForKey:nameOfView] setHidden:YES]; 

이 뜻을 위해, -imageView1라는 방법 imageView1라는 이름의이 바르 및 _imageView1라는 마지막으로 바르 찾습니다. 이 기법은 코코아에서 많이 사용되며 이해하는 것이 중요합니다. 이것은 우리가 일을주의 깊게 명명하는 많은 이유 중 하나이며 우리가 메모리 관리를 담당하는 접근자를 만드는 또 다른 이유입니다. 자세한 내용은 문서에서 '키 - 값 규정 준수'를 검색하십시오.

이제는이 특정 사례에 대해 JimG의 솔루션과 비슷한 방식으로보기의 NSArray를 사용하여 루프를 돌릴 수 있고 색인을 기반으로 원하는 항목을 켜거나 끌 수 있습니다. 그러나 그것이 적절하지 않은 경우를 많이 상상할 수 있습니다. KVC가있을 수 있습니다.

4

왜 NSArray에 인스턴스를 넣고 인덱스에 넣지 않습니까? 이 경우 내가 디자인에 대해 관심있는 사람들에 동의하지 않습니다 : [실종 별표, 죄송 편집]

관련 문제