类名的NSString占位符

时间:2014-07-16 10:19:30

标签: ios objective-c cocoa-touch uiviewcontroller nsstring

如何使用占位符作为类的名称?我有基于传入参数的方法按名称引用其他类。在下面的粗略示例中,我需要能够仅基于名称加载三个ViewControllers中的一个(不是ViewControllers数组,因为这只是一个示例)。

-(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];

}

例如,如果方法是使用参数' 1'

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

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

其他问题似乎暗示[NSClassFromString:nameOfVCToLoad]可能符合我的需要,如果是这样的话?

2 个答案:

答案 0 :(得分:2)

你对自己的对象感到困惑。你正在寻找这个

NSClassFromString(vcOne)将帮助您进行动态类选择

isKindOfClass将帮助您确定该类是否是给定的类

-(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];

}

答案 1 :(得分:0)

Objective-c具有Class类型,作为NSObject的一部分存在。

更准确的是:

-(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
}
这样做的

好处是在编译时的类型检查

相关问题