2010-01-19 5 views
4

나는 objective-c에서 새로 왔고 문제가 생겼다. 함수의 인수를 변수 이름으로 사용할 수 있습니까?objective-c에서 변수 이름으로 인수 사용

예를 들어, 이미지 묶음이 aPic1, aPic2, bPic1, bPic2, cPic1, cPic2 인 경우 단추를 클릭 할 때마다보기 컨트롤러가 Pic1을 숨길 수 있도록 동작을 만들고 싶습니다. 클릭 한 버튼에 따라 Pic2를 표시합니다.

- (void) performAction:(NSMutableString *) text 
{ 
    [text appendString:@"Pic1"].hidden = YES; //I wanna hide textPic1, which is a UIImageView 
    [text appendString:@"Pic2"].hidden = NO;  //I wanna show textPic2, which is also a UIImageView 
} 

이 경우 NSString 또는 NSMutableString을 사용하면 안됩니다. 누구나 이런 종류의 기능으로 어떻게 내 목표를 달성 할 수 있는지 알 수 있습니까? 감사.

+0

미리 알림 : 잊지 마세요 귀하의 질문에 유용한 대답을 유용하고 가장 유용한 것으로 표시하십시오. –

답변

5

예하실 수 있습니다. (c) :)

해결책을 찾기 위해 (변수를 쉽게 사용하거나 자신의 setter 및 getter를 작성하여) 메소드를 통해 변수에 액세스 (설정/가져 오기) 할 수 있어야합니다.

다음은 예입니다 :

- (void)performAction:(NSMutableString *)text { 
    [(UIImageView *)[self performSelector:NSSelectorFromString([text stringByAppendingString:@"Pic1"])] setHidden:YES]; 
    [(UIImageView *)[self performSelector:NSSelectorFromString([text stringByAppendingString:@"Pic2"])] setHidden:NO]; 
} 

실제로 단순히 내가 할 것이다, 빨리 목표 - C의 멋진 기능을 사용하여 얻을 시작하는 당신에게 샘플 코드를 제공에 대해 생각 특성에 관해서. 너무 많은 인터넷 종이가 필요할 수 있기 때문에이 주제에 대해 자세히 알지는 못하지만, 이것이 샘플 코드 다음에 추가 읽기 용으로 몇 개의 링크를 추가하는 이유입니다.

@interface AClass : NSObject { 
    // Here's where you declare variables 
    NSObject *objectForInternalUseWeWantToBeRetained; 
    id linkToObjectUsuallyNotRetained; 
    int nonObjectVariable; 
    BOOL aVariableWithARenamedGetter; 
} 

// And here's where their properties are declared 
@property (nonatomic, retain) NSObject *objectForInternalUseWeWantToBeRetained; 
@property (nonatomic) id linkToObjectUsuallyNotRetained; 
@property (nonatomic, assign) int nonObjectVariable; 
@property (nonatomic, assign, getter=renamedVariableGetter) BOOL aVariableWithARenamedGetter; 


@end 


@implementation AClass 

// Here we command the machine to generate getters/setters for these properties automagically 
@synthesize objectForInternalUseWeWantToBeRetained, linkToObjectUsuallyNotRetained, nonObjectVariable, aVariableWithARenamedGetter; 

// But you can implement any of the getters/setters by yourself to add some additional behaviour 
- (NSObject *)objectForInternalUseWeWantToBeRetained { 
    // Some additional non-usual stuff here 

    // And after that we do the getters job - return the variables value 
    return objectForInternalUseWeWantToBeRetained; 
} 

// And of course we don't forget to release all the objects we retained on dealloc 
- (void)dealloc { 
    [objectForInternalUseWeWantToBeRetained release]; 

    [super dealloc]; 
} 


@end 

// And here's where their properties are declared 
@property (nonatomic, retain) UIImageView *testPic1; 
@property (nonatomic, retain) UIImageView *testPic2; 


@end 

경고 : 나는 suff를 매우 빠르게 돌았습니다. Here's a nice tutorial at CocoaCast blog - Properties in Objective-C 2.0, 나는 이것이 좋은 출발점이라고 생각한다. BTW는 학습 자료 (팟 캐스트, 스크린 캐스트 등)를 많이 제공하므로 사이트를 탐색하는 것이 유용 할 수 있습니다. 물론 Objective-C와 Cocoa에 관해 배울 수있는 주요 장소는 공식 문서 인 here's where it is about properties입니다.

+1

'valueForKey :'는 똑같은 일을합니다;) –

+0

하지만 처음이었습니다! : D이 작업을 수행하는 데는 여러 가지 방법이 있습니다 ... 우리는 NSInvocation을 통해 동일한 결과를 얻는 것에 대해서도 언급하지 않았습니다. o_O –

+0

도움을 주신 이반에게 감사드립니다. 이것은 내 문제를 해결합니다. 그러나 선언 속성을 언급하면서 항상 각 변수에 대해 올바른 속성을 선택하는 방법을 궁금해했습니다.(분명히 나의 독서는 심각하게 부족하다 : p) 당신이 나에게 약간의 가이드를 줄 수 있으면 감사한다. 감사. – Anthony

1

당신은 사전에 모든 하위 뷰를 저장할 수 : 다음

NSMutableDictionary *viewsByName = [[NSMutableDictionary alloc] init]; 

[viewsByName addObject:aPic1 withKey:@"aPic1"]; 
[viewsByName addObject:aPic2 withKey:@"aPic2"]; 
[viewsByName addObject:bPic1 withKey:@"bPic1"]; 
[viewsByName addObject:bPic2 withKey:@"bPic2"]; 

과 :

- (void) performAction:(NSString *) text 
{ 
    ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic1",text]]).hidden = YES; 
    ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic2",text]]).hidden = NO; 
} 
+0

아무도 신경 쓰지 않는다면 약간의 추가가 있습니다. 태그 사용에 관해서는 실제 숫자를 사용하는 것이 아니라 태그에 대한 상수 (예 : TAG_IMAGEVIEW_PIC1)를 정의하는 것이 좋습니다. 사전을 사용하는 경우 - 변경 불가능한 데이터를 저장하는 데 사용할 수있는 사전을 사용하지 않는 것이 좋습니다. 또 다른 중요한 점은 뷰와 함께 viewDidUnload에서이 사전을 릴리스하는 것을 잊지 않는 것입니다. –

3

이것은 가능하지만 원형 교차로입니다. 당신은 클래스의 인스턴스 변수를 @properties를 확인한 다음을 통해 액세스 할 수 있습니다 :

id myIvar = [self valueForKey:[text appendString:@"Pic1"]]; 
[myIvar setHidden:YES]; 

아니면 런타임에 낮은 가서이 방법을 사용할 수 있습니다

#import <objc/runtime.h> 

id myIvarValue = nil; 
[text appendString:@"Pic1"]; 
Ivar theIvar = object_getInstanceVariable(self, [text UTF8String], &myIvarValue]; 
[myIvarValue setHidden:YES]; 
관련 문제