参考自Xcode Tips and Tricks - Workspaces and Frameworks
当你创建一个新的project的时候,会自动创建一个workspace,所以就可以将其它的project和document,添加到你的workspace中,这样你就可以访问其它project中的模块
把一个project添加到workspace中,并不会duplicate复制它,workspace仅仅是持有project在disk上的位置的引用
当第一次创建一个project的时候,也会自动创建一个target。target包含了build一个app所需指令,也可以创建多个target
那,为什么要在一个workspace中使用多个project呢?
framework和project编译的单一结果称为module,你可以将这些module添加到workspace。如果类型声明为public,则每个module可以使用其它module的相关代码。
UIKit就是一个module,在你需要使用UI的地方,导入UIKit即可
例如,当新创建一个project的时候,那么这个project就被given一个workspace,只是说这个workspace是被嵌在project的包里面的,你看不见而已
如下,在.xcodeproj
右键->显示包内容,可查看其中的workspace
在本例子中介绍的例子是,有个Checkbox
模块,在Xcoder
项目中使用
1.Checkbox
模块中的要共用的类,设为public
2.在Xcoder
项目中,右键->”Add Files to Xcoder”
需要注意的是,添加的时候,不用使用Xcode打开Checkbox
模块,否则添加进来的模块,前面没有展开的三角形符号。也不要勾线Copy items into…
如下选择Checkbox.xcodeproj
,添加之后的效果如下:
3.添加Checkbox
模块到Xcoder
项目中的target,拖动Checkbox.framework
到Embedded Binaries
4.在需要使用到Checkbox类的地方,导入Checkbox
模块
import Checkbox
5.如果在Storyboard中使用了Checkbox
模块中类,需要指定模块,否则会报错
如何将一个project导入到另一个project中,还可以参考:
参考:Multi Project Setups
此文章在一个workspace中添加多个project
注意将project添加到workspace时,要注意选择如下的内容:
至于project之间依赖的方式,与上面类似
在Xcode中创建一个project的时候,会自动创建一个target、一个scheme,2个configuration
target用来build最后的product
scheme用来执行action,如下所示,列出了依赖的列表,所以Checkbox framework会在Xcoder build之前build:
如下所示,可将build configuration从release改为debug
project、scheme、build configuration、target之间的关系如下:
build configuration在设置不同的flag和运行script方面非常有用
如下的例子,创建一个新的target,发一个新的Xcoder的app
1.先创建一个新的build congfiguration,如下所示,复制一个release的build configuration
在project中,选择Xcoder
2.选择Target->Build Setting,基于新的build configuration文件定义一个新的自定义的setting,通过other swift
过滤,如下:
点击加号,输入-DLITE_VERSION
-D
告知Swift,LITE_VERSION
是一个flag
现在就有了个叫做Lite Version Release的build configuration,它里面有个叫做LITE_VERSION
的flag。默认创建的Debug和Release build configuration并没有这个flag
现在就需要编辑scheme来使用这个Lite Version配置,来运行这个app
3.选择Manage Scheme
复制一个Xcoder,叫做Xcoder Lite
并将其Build Configuration
改为Lite Version Release
4.检验是否是运行的Lite Version
在AppDelegate
中的didFinishLaunchingWithOptions launchOptions:
方法中,添加代码
根据Lite Version
标志位flag是否存在,则编译不同的代码
#if LITE_VERSION
print("LITE_VERSION")
#else
print("FULL_VERSION")
#endif
如果在build的时候提示”No such module….”,可参考Swift frameworks do not work with build configurations named other than ‘Debug’ or ‘Release’: No such module
在
Build Settings
中的Framework Search Path
,添加$(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
,并使它non-recursive
5.控制台的输出如下:
LITE_VERSION
这样之后,就可以根据LITE_VERSION
这个flag,来自定义一些代码,如:
#if LITE_VERSION
fetchRequest.fetchLimit = 5
#endif
设置不同的product bundle identifier 和 product name
创建不同的target,不同的target,可以有不同的assets和不同的代码文件
1.在Target下的Xcoder,右键选择Duplicate
在弹出的提示框中,选择Duplicate Only
此时自动创建了一个名为Xcoder Copy
的target,也创建了一个名为Xcoder Copy
的Scheme。现在将它们的名称都改为Xcoder Lite
2.创建LITE_VERSION
步骤与上面类似,为Debug和Release,创建LITE_VERSION
标志位
3.为不同的target设置不同的Bundle idetifier
4.使用不同的code和assert
如下所示,选择某一个代码文件,在右侧的Target Membership
中,可查看其属于的target
所以可以选择每个target使用的code,即可以选择哪个code在哪个target里
国际化标题
1.如下创建一个新的Localization
2.在Manage Scheme
中再duplicate一个Xcoder,名字叫做Xcoder Chinese
在Run->Options
中,并将Application Language改为对应的语言
3.在Main.storyboard
下就有Main.strings
文件了
将如下内容修改为中文
/* Class = "UINavigationItem"; title = "Keyboard Shortcuts"; ObjectID = "Y9b-Gg-7Lv"; */
"Y9b-Gg-7Lv.title" = "快捷键";
界面显示效果如下,就有中文显示了: