2014-07-16 3 views
1

클래스 이름에 대해 어떻게 자리 표시자를 사용합니까? 들어오는 매개 변수를 기반으로 다른 클래스를 이름으로 참조하는 메소드가 있습니다. 아래의 예제에서는 하나의 예제만으로 ViewController 배열이 아닌 이름만으로 세 개의 ViewController 중 하나를로드 할 수 있어야합니다. 이 방법은 '1'클래스 이름에 대한 NSString 자리 표시 자

NSString *nameOfVCToLoad = [vcArray objectAtIndex:vcNumberToLoad]; //this would = secondViewControllerName 

UIViewController secondViewControllerName = [[UIViewController alloc] init]; 
[self.navigationController pushViewController:secondViewControllerName animated:NO]; 

다른 질문의 매개 변수와 함께 실행 된 경우

-(void)loadViewController:(int)vcNumberToLoad 
{ 
    NSString *vcOne = @"firstViewControllerName"; 
    NSString *vcTwo = @"secondViewControllerName"; 
    NSString *vcThree = @"thirdViewControllerName"; 

    NSArray *vcArray = [NSArray arrayWithObjects:vcOne, vcTwo, vcThree, nil]; 

    NSString *nameOfVCToLoad = [vcArray objectAtIndex:vcNumberToLoad]; 

    UIViewController |VALUE OF nameOfVCToLoad| = [[UIViewController alloc] init]; // What is the code to get the value of nameOfVCToLoad to be used as the instance name of the UIVC class 
    [self.navigationController pushViewController:|VALUE OF nameOfVCToLoad| animated:NO]; 

} 

예를 들어, 친밀한하는 것 그 [NSClassFromString : nameOfVCToLoad] 내가 필요의 라인을 따라 수, 그렇다면 어떻게?

+1

왜 당신을에게인지 isKindOfClass는 식별하는 것이 도움이 될 것입니다 ** 로컬 ** 변수 이름에 대해 신경 써야합니까? – Vladimir

+0

이것은 순전히 클래스의 실제 이름에 대한 자리 표시 자로 NSString을 사용하는 방법을 알고 자하는 주요 요점을 설명하기위한 예제였습니다. – Ryan

+1

변수 이름은 개발 세션 중에 코드를 읽을 수있게하기위한 것입니다. _runtime_에서 var의 이름은 프로세서에서 사용하지 않고 _addresses_에서만 작동합니다. 그래서 _runtime_ 동안 변수 이름을 동적으로 정의하는 것에 대해 묻는 것은 실제로는별로 중요하지 않습니다. – holex

답변

2

당신은 객체에 대해 혼란스러워합니다. 당신은 당신이 동적 클래스 선택을하는 데 도움이 될 것입니다이 하나

NSClassFromString (vcOne)를 찾고 있습니다

클래스가 지정된 클래스

-(void)loadViewController:(int)vcNumberToLoad 
{ 
    NSString *vcOne = @"firstViewControllerName"; 
    NSString *vcTwo = @"secondViewControllerName"; 
    NSString *vcThree = @"thirdViewControllerName"; 


    firstViewControllerName *fvc = nil; 
    secondViewControllerName *svc = nil; 
    thirdViewControllerName *tvc = nil; 


    NSArray *vcArray = [NSArray arrayWithObjects:vcOne, vcTwo, vcThree, nil]; 

    NSString *nameOfVCToLoad = [vcArray objectAtIndex:vcNumberToLoad]; 


    UIViewController *aLoadedViewController = [[NSClassFromString(nameOfVCToLoad) alloc] init]; 

    if ([aLoadedViewController isKindOfClass:[NSClassFromString(vcOne)]]) { 

     fvc = aLoadedViewController; 

    } 
    else if ([aLoadedViewController isKindOfClass:[NSClassFromString(vcTwo)]]) { 

     svc = aLoadedViewController; 

    } 
    else if ([aLoadedViewController isKindOfClass:[NSClassFromString(vcThree)]]) { 

     tvc = aLoadedViewController; 

    } 

    [self.navigationController pushViewController:aLoadedViewController animated:NO]; 

} 
+0

다소 복잡한 방법을 통해 ... 어쨌든 +1합니다. – trojanfoe

+0

많은 viewController가 있다면? 매우 길고 역동적이지 않은 if 문을 작성해야합니다. – Ryan

+0

특정보기 컨트롤러에 대해 알아보고 추가 데이터를 제공하려면이를 수행해야합니다. 다른 현명한 필요는 없습니다. –

0

목표 -c는 NSObject의 일부로 존재하는 Class 유형을가집니다.

더 정확하게 될 것입니다 :

-(void)loadViewController:(int)vcNumberToLoad { 
    Class vcOne = [FirstViewControllerName class]; 
    Class vcTwo = [SecondViewControllerName class]; 
    Class vcThree = [ThirdViewControllerName class]; 

    Class viewControllerClass; 
    // switch between classes 

    UIViewController *viewControllerToPush = [[viewControllerClass alloc] init]; 
    // push UIViewController 
} 

이 같은 일을 혜택을 컴파일 타임에을 검사 유형입니다.