不喜歡使用storyboard。而新建一個Single View Application工程后,總是要刪除Main.stroyboard、修改工程配置、創建顯示window。于是,就想能不能自定義一個工程模板來做這些事。參考一些資料后就有了這篇文章
目標:新建這樣一個project template
- 不包含Main.storyboard;
- 在AppDelegate.m中自動引入#import "ViewController.h"
-
自動創建并顯示Windows
效果圖如下:
圖1
Xcode 8的有兩種project templates:
- xcode定義的project templates。存放在目錄
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates
和
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates(這是iOS的project templates,其他平臺的project templates這里沒列出); - 用戶自定義的project templates;
存放目錄為:
~/Library/Developer/Xcode/Templates
默認情況~/Library/Developer/Xcode/目錄下沒有Templates文件夾,需要手動創建。
在終端中輸入以下命令可搜索到所有包含工程模板的路徑
sudo find / -name Templates
結果如下
圖2
我們經常使用的Single View Application工程模板所在目錄為:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application/Single View Application.xctemplate
我們自定義的project template就是參考的這個project template。
準備工作就到這了,下面開始創建自定義的工程模板。
一、在選擇工程模板的面板中顯示自定義的工程模板
效果如下圖:
- 在用戶定義project templates目錄下創建和Single View Application.xctemplate模板同樣的目錄結構,即在~/Library/Developer/Xcode/下創建如下目錄結構:
Templates/Project Templates/iOS/Application/Single View No Storyboard.xctemplate/
(其中Single View No Storyboard.xctemplate/自定義模板的名字)
完整的目錄結構為:
~/Library/Developer/Xcode/Templates/Project Templates/iOS/Application/Single View No Storyboard.xctemplate/ -
拷貝Single View Application.xctemplate下的
TemplateIcon.png
TemplateIcon@2x.png
TemplateInfo.plist
到
Single View No Storyboard.xctemplate。
(我們要的就是不包含Main.storyboard的工程,所以不拷貝這個文件)
要拷貝的文件如下圖
圖4 - 修改模板圖標和標識模板
圖3中包含兩個平圖片,這個圖片就是圖2中顯示的模板的圖標。該圖標可改可不改。修改或替換時注意命名和圖片尺寸要和原圖一樣。
每個模板都有一個唯一的ID用于識別和區分模板,這個ID就是TemplateInfo.plist
中的identifier。拷貝TemplateInfo.plist之后要修改這個identifier字段。本文中修改為com.apple.dt.unit.singleViewApplicationNoStoryboard,如圖4
圖5
至此、保存TemplateInfo.plist,再新建工程的時候就會彈出如圖2那樣的模板選擇面板。
二、自定義模板
現在我們已經做好的自定義的模板的入口。接下來就是真正的自定義模板了。
具體操作如下:
-
在邏輯上刪除Main.storyboard
刪除自定義模板的TemplateInfo.plist中的Ancestors節點下的com.apple.dt.unit.storyboardApplication,如下圖
圖6 在AppDelegate.m中自動引入#import "ViewController.h"、自動創建并顯示Windows
在Option->Item0->Units->Objective-C->Nodes下添加兩條數據
AppDelegate.m:imports:importHeader:ViewController.h
AppDelegate.m:implementation:methods:applicationdidFinishLaunchingWithOptions:body
然后再在Option->Item0->Units->Objective-C下添加一條字典類型的數據Definitions,其中key為
AppDelegate.m:implementation:methods:applicationdidFinishLaunchingWithOptions:body
value為
// Override point for customization after application launch.
_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_window.backgroundColor = [UIColor whiteColor];
_window.rootViewController = [ViewController new];
[_window makeKeyAndVisible];
如下圖
注意:以上內容是基于xcode 8.3制作。以后新版xcode可能會有不同。但思路及時這個思路。