NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。
正常来说,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。
代码:
//
// MainVC.m
// TestFanshe
//
// Created by 张信娟 on 16/11/11.
// Copyright © 2016年 张信娟. All rights reserved.
//
#import "MainVC.h"
#import "FirstVC.h"
#import "SecondVC.h"
#import "ThirdVC.h"
#import "MineVC.h"
@implementation MainVC{
NSString *_beginVcName;
}
-(void)viewDidLoad
{
[super viewDidLoad];
NSString *key = [[NSUserDefaults standardUserDefaults]objectForKey:@"key"];
if ([key isEqualToString:@"0"]) {
_beginVcName = @"SecondVC";
NSLog(@"在SecondVC");
}else
{
_beginVcName = @"MineVC";
NSLog(@"在MineVC");
}
[self setupTabBarChildControllers];
}
-(void)setupTabBarChildControllers
{
NSArray *imageArray = @[@"chanpin",@"chanpin",@"chanpin"];
NSArray *titleArray = @[@"产品1", @"个人中心2", @"消息3"];
NSArray *className = @[@"FirstVC",_beginVcName,@"ThirdVC"];
for (int i = 0; i < imageArray.count; i++) {
[self addChildControllersForClassName:className[i]
whitTile:titleArray[i]
andImage:imageArray[i]];
}
[self setDelegate:(id<UITabBarControllerDelegate> _Nullable)self];
[self.tabBar setBarTintColor:[UIColor whiteColor]];
}
-(void)addChildControllersForClassName:(NSString *)className whitTile:(NSString *)title andImage:(NSString *)imageName
{
UIViewController *vc = [[NSClassFromString(className) alloc]init];//这
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
[self addChildViewController:nav];
vc.tabBarItem.image = [[UIImage imageNamed:imageName] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"_lan"]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.title = title;
}
@end