2012-01-24 3 views
1

여기에 자비를 베푸십시오.NSString 값을 사용하여 UILabel을 참조하십시오.

저는 UILabel 인스턴스의 이름 인 즉석에서 생성하는 NSString 값을가집니다. 레이블을 보내 텍스트를 업데이트하는 메시지를 보내려고합니다. 그러나 두 데이터 유형이 일치하지 않습니다.

헤더 파일에서 :

IBOutlet UILabel *Clue1; // IBOutlet and IBAction are IDE flags 
IBOutlet UILabel *Clue2; // IB = interface builder 
IBOutlet UILabel *Clue3; 

구현 파일에서 : 여기에 충분한 코드는 (내가 생각하는)의이 SO에 대한 몇 가지 비슷한 질문이지만, 아무도가 나를 위해 충분히 가까이하지

- (IBAction) newPuzzle:(id)sender { // Clear all fields & get new clue 

    [Clue1 setText:@""]; // Clear the fields 
    [Clue2 setText:@""]; 
    [Clue3 setText:@""]; 

    // Send up a randomly chosen new clue 

    NSArray *clues = [NSArray arrayWithObjects:@"222", @"333", nil]; 
    NSInteger randomIndex = arc4random()%[clues count]; 
    NSString *aClue = [clues objectAtIndex:randomIndex]; 

    // The clue will be split into component digits and each piece sent to a different label 

    for (NSInteger charIdx = 0; charIdx < aClue.length; charIdx++) { 
     NSString *cluePos = [NSString stringWithFormat:@"Clue%d", charIdx + 1]; 
     NSLog(@"%@", cluePos); // works 
     [cluePos setText:@"test"]; // Xcode notes the type mismatch 
    } 
} 

그들이 적어도 내가 말할 수있는 한 그들이 내 사건에 적용된다는 것을 인정한다. 다른 언어 (R)의 용어를 사용하여 cluePos의 클래스를 NSString에서 UILabel로 강제 변환해야합니다. Xcode 4.2.1 및 OSX 10.7.2를 사용 중입니다.

TIA.

답변

3

문자열이 근본적으로 다르기 때문에 문자열을 레이블에 강제 변환 할 수 없습니다. 이 문자열은 View Controller 클래스 나 속성 (일부는 레이블 일 수 있음)에 대한 지식이 없습니다.

그러나 valueForKey : 메서드를 사용하여 이름으로 개체의 속성을 가져올 수 있습니다. 여기서 이름은 문자열로 지정됩니다. 그래서 내보기 컨트롤러에 Clue1라는 속성을 얻기 위해 나는 말할 것 :

NSString *cluePos = [NSString stringWithFormat:@"Clue%d", charIdx + 1]; 
UILabel *label = [self valueForKey:cluePos]; 
label.text = @"test"; 

(I이 경우 '자기'를 있으리라 믿고있어을 의미 :이

UILabel *label = [self valueForKey:@"Clue1"]; 

또는 귀하의 경우를, 뷰 컨트롤러이지만 속성이있는 모든 객체에서이 메서드를 호출 할 수 있습니다.

NSSelectorFromString을 사용하여 문자열을 선택기로 변환하는 또 다른 방법이 있습니다. 즉,이과 같습니다

당신의 목적 중 하나 솔루션
SEL selector = NSSelectorFromString(@"Clue1"); 
UILabel *label = [self performSelector:selector]; 

선택기를 사용, 똑같이 잘하지만 장점을 작동 당신이 그렇게 객체를 반환하는 메서드를 호출 할 수 있습니다 (메서드 호출에 인수를 전달할 수 있다는 것입니다 , 단지 부동산이나 IBOutlet에 접속하는 것이 아닙니다).

속성에 액세스하거나 존재하지 않는 메서드를 호출하려고하면 두 방법 모두 예외가 발생합니다. 다음과 같이 말하기 전에 재산이 존재하는지 테스트 할 수 있습니다.

SEL selector = NSSelectorFromString(@"Clue1"); 
BOOL labelExists = [self respondsToSelector:selector]; 
if (labelExists) 
{ 
    UILabel *label = [self performSelector:selector]; 
    label.text = @"test"; 
} 
else 
{ 
    //do something else 
} 
+0

감사합니다. 대체가 어떻게 작동하는지 정확히 알기 위해 valueForKey와 속성을 조금 공부해야합니다. label.text = @ "test"대신 텍스트를 변수로 지정하고 싶습니다. 특히 [aClue characterAtIndex : charIdx]를 표시 할 값으로 전달하려고합니다. 어떻게 그 방법을 제안 할 수 있습니까? 아직도 배우기! 고맙습니다. –

+0

주어진 색인에서 문자를 가져 오려면 대신 [aClue substringWithRange : NSMakeRange (charIdx, 1)]을 시도하십시오. 이렇게하면 한 문자만큼 긴 문자열을 반환하므로 unichar보다 쉽게 ​​작업 할 수 있습니다. –

+0

감사합니다, 매력처럼 작동합니다. 더 많은 공부를하지만, 이것이 내가 가장 잘 배울 수있는 방법입니다. 다시 고마워. –

관련 문제