如何使用占位符作为类的名称?我有基于传入参数的方法按名称引用其他类。在下面的粗略示例中,我需要能够仅基于名称加载三个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]可能符合我的需要,如果是这样的话?
答案 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
}
这样做的好处是在编译时的类型检查。