一、多Target的应用场景
现在公司中可能会同时存在多个项目,而且因为业务关系,这些项目基本上大同小异,功能大体相同,差异较小,这个时候,如果我们每个项目都单独一份代码的话,那么其中有很大一部分重复工作,既费时又费力,那么有没有简单有效的解决方案呢,在iOS
中我们可以通过多Target
的方式实现。
二、主要两点操作
- 当一个文件为多个
Target
公用时,可以用宏区分 - 当一个文件为单独的
Target
专用时,可以设置选择属于自己的Target
三、实现
1、创建MutableTarget
我们在Xcode
中创建一个新的项目,项目目录结构如下图:
因为我们实现多Target之后,多个项目可能有不同的设置项,所以此处我们将默认的plist文件名字换掉以作区分:
为了区分不同Target的不同界面,我们现将默认的Target名字修改为Target1
:
然后我们创建一个类TargetOneViewController
,
因为此时项目中只有一个Target
,所以此时是默认选中了Target1
的:
其实现如下:
修改入口类,此时我们运行项目效果如下:
2、创建Target2
接下来我们为MutableTarget
项目创建一个新的Target
,方法有两种:
- 第一种:Xcode->File->New->Target (不推荐)
- 第二种:(推荐)如下图:
然后新的Target
就会创建好了,之所以推荐这种方式创建新的Target
是因为,这方式创建的Target
其实是复制了原来的Target
,这点从名字就可以看出来,新的Target
会拥有原来的Target
的配置作为默认配置,我们将新的Target
重命名为Target2
创建Target2的plist文件
因为我们不同Target
对应的可能是不同的App,而且两个App可能会同时安装在一个设备上,所以我们需要两套plist文件来配置不同的Target
,此处我们直接将Target1
的plist文件复制一份,修改名字,然后添加到项目中:
因为新的plist文件是配置Target2
的,所以此处我们选中Target2
,下一步,添加plist文件引用路径:
此时我们尝试运行Target2
,我们发现此处的名字并没有修改掉:
为了方便理解,我们将此处的名字修改为相应的Target
的名字,点击Manager Schemes
修改为相应的名字(选中Target1 copy,回车即可编辑修改):
之后我们运行Target1
和Target2
,结果如下:
结果发现,尽管我们运行了不同的Target
,但是效果却是一样的,这是因为此时我们的入口类代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *target1Nav = [[UINavigationController alloc] initWithRootViewController:[[NSClassFromString(@"TargetOneViewController") alloc] init]]; self.window.rootViewController = target1Nav; return YES;}复制代码
我们一直加载的是TargetOneViewController,所以结果都是一样的,然后我们创建一个新的类TargetTwoViewController
实现如下:
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; UILabel *label = [[UILabel alloc] init]; label.frame = self.view.bounds; label.backgroundColor = [UIColor clearColor]; label.textColor = [UIColor blueColor]; label.textAlignment = NSTextAlignmentCenter; label.text = @"这是第二个target"; [self.view addSubview:label];}复制代码
那么如何让Target2
加载TargetTwoViewController
类呢,此时我们就需要在入口类区分什么时候加载Target1
,什么时候加载Target2
了
3、使用宏区分不同的Target
如何区分不同的Target呢,Xcode给我们提供了定义宏的地方:
我们在此处添加宏定义Target
,宏定义的名字可以任意写,但是两个Target
中的宏定义名字要保持一致,只是直不同:
**注:**此处Debug
与Release
两种模式都要添加。 然后入口类中代码这么修改:
运行:
至此,多Target的使用基本几经介绍完毕