Swift項目:新浪微博
聲明:本文爲博主Donkey-Tao 原創,如需轉載請註明出處。
本項目使用swift3完成。
寫在項目之前:
Swift中自定義LOG:在Debug環境下打印內容,但是在Release環境下不顯示打印
- 自定義標記->項目 ->buildSettings -> Swift flag -> Debug ->-D DEBUG
- if DEBUG 和endif
1.獲取所在文件:
// 1.獲取打印所在的文件
let file=(#file as NSString).lastPathComponent
2.獲取打印所在的方法
// 2.獲取打印所在的方法
let funcName = #function
3.獲取打印所在的行
// 3.獲取打印所在行數
let lineNum = #line
4.整個到一個TFLog函數中,並將函數放在AppDelegae.swift中,這樣可以實現整個項目中都可以用,利於團隊合作。
func TFLog<T>(_ messsage : T, file : String = #file, funcName : String = #function, lineNum : Int = #line) {
#if DEBUG
let fileName = (file as NSString).lastPathComponent
print("\(fileName):(\(lineNum))-\(messsage)")
#endif
}
其中上面函數中的
#if DEBUG
#endif
可以通過TAGETS -> Build Settings -> Other Swift Flags -> Debug ->Any Architecture|Any SDK方式修改,在其中添加"-D DEBUG",表示debug環境下有這樣的一個標記。加上上面的這些就可以讓TFLog()打印的東西在Debug環境下顯示,在Release環境下不顯示。
到此在項目中以後就可以使用這樣的自定義的TFLog()函數作爲打印調試用,以後在其他的項目中也可以直接拿過去就用。
項目的部署:OSChina
本項目採用Git管理源代碼,爲個人練手項目。所以,源代碼開源且同時部署在GitHub和OSChina上面。
首先在OSChina上面新建項目SinaWeib。這裏沒有采用SSH方式實現代碼的管理,而是採用HTTPS方式來進行代碼的管理。https://git.oschina.net/taofei0610/SinaWeibo.git
然後將項目Clone到的我的電腦上面,打開終端進入到代碼存儲的目錄下,使用命令Clone下OSChina上面的項目。
//用到的命令
cd /Users/taofei/Documents/TFCode/TFOSChina
git clone https://git.oschina.net/taofei0610/SinaWeibo.git
cd SinaWeibo
touch .gitignore
git add .
git commit -m "add gitignore"
git push
到此就將OSChina上面的項目Clone下來了,但是由於OSChina上面創建項目時沒有swift的.gitignore,所以我們要去GiyHub中找到swift項目開發中的gitignore並將其複製後加入我們的項目中。(https://github.com/github/gitignore)
注意:一般在這裏複製的.gitignore中的內容時最好將#Pods中的#去掉,這樣上傳時不用將CocoaPods中的文件上傳,只上傳Podfile中的內容
這樣關於swift的.gitignore文件就在項目中了,我們需要git對其進行管理。用命令將其加入然後提交本地最後push到OSChina即可。
下面我們就可以新建swift項目放到剛纔clone下來的與.gitignore同級的目錄下。用Xcode創建完項目後我們就可以利用Xcode集成的Source Controller來commit,push項目代碼了,當然命令行重度用戶可以繼續命令行也是特別好的。(此過程中第一次要輸入OSChina的賬號密碼,直接輸入就好了。)到此,項目部署完畢。
注意:這裏項目名稱一定要規範儘量不要出現特殊的符號
項目的基本設置
項目配置
- 部署版本(Deployment Target):本項目支持9.0及以上版本。(Swift很多要用到的語法比較新)
- 設備(Devices):iPhone
- 設備方向(Device Orientation):本項目只支持豎屏。
- 啓動圖片(Launch Screen Source):Use Asset Catalog.
到這裏我們可以將已有的啓動圖片添加到項目的啓動圖片文件夾中了。要想盡量沒有警告可以將沒有用到的items移除。項目圖標也是同樣。
這裏APP在模擬器上顯示的是用們的項目名稱,要想讓其顯示對用戶比較有好多名稱在項目的info.plist文件中修該Bundle name(或者Bundle display name) 後面的值爲自己想要顯示給用戶的名稱即可。我這裏改爲:微博。
最後設置下項目前綴(class prefix):TF
整理項目文件目錄結構
加入classes文件夾,裏面分爲:Main,Home,Message,Discover,Profile.
注意:整理完目錄結構要記得提交
純代碼初始化項目
一般現在公司用storyboard還是比較多的,蘋果推出的很多技術都是storyboard相關的。本項目用純代碼來實現是爲了在此過程中熟練swift開發。
既然是純代碼方式就要將Main Interface中的main去掉,然後自己在AppDelegate中創建Window。
創建窗口的跟控制器爲:TFMainTabBarController,放在Main文件夾中。在AppDelegate中設置window的跟控制器時使用到TFMainTabBarController時不需要import。
首先要解決默認藍色的tabBarItem選項的問題
//解決解決默認藍色的tabBarItem選項圖片的問題
tabBar.tintColor = UIColor.orange
//或者在AppDelegate中設置tabBar的全局背景色
UITabBar.appearance().tintColor = UIColor.orange
在TFMainTabBarController中我們要添加最少五個控制器,其中四個是類似的。所以,在此我們可以重載addChildViewController方法,並將其設置爲private。將具體的添加子控制器要做的事封裝在這個方法中。然後在主控制器中添加這四個相似的子控制器。
當然也可以傳字符串給函數,讓去創建子控制器
//0.1獲取命名空間,根據字符串創建控制器
let nameSpace = Bundle.main.infoDictionary!
guard let childController = NSClassFromString(nameSpace + "." + guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else{
TFLog("沒有獲取到命名空間")
return
}
guard let _ = NSClassFromString(nameSpace + "." + "TFHomeViewController")else{
TFLog("根據字符串創建控制器失敗")
return
}
//0.2將對應的AnyClass轉換爲控制器類型
guard let childVCType = childController as? UIViewController.Type else{
TFLog("沒有獲取到控制器的類型")
return
}
//0.3根據控制器類型創建控制器
let vc = childVCType.init()
//上面通過字符串創建控制器看上去很是蛋疼,但是其實還是有用的。我們可以利用這點要根據json文件去創建控制器。
//0.0.1獲取json文件的路徑
guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings", ofType: "json") else{
TFLog("沒能獲取到json數據")
return
}
//0.0.2讀取json文件中的內容:數組->字典,要按照讀取字符串的方法來讀取
guard let jsonData = NSData(contentsOfFile: jsonPath) else{
TFLog("沒有獲取到json文件中的數據--jsonData")
return
}
//0.0.3將NSData類型轉換爲數組類型,數組以及數組中存放的字典,進行兩層校驗
guard let anyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else{
TFLog("jsonData轉anyObject失敗")
return
}
guard let dictArray = anyObject as? [[String :AnyObject]] else{
TFLog("anyObject轉字典數組失敗")
return
}
for dict in dictArray{
TFLog("---------------")
TFLog(dict)
}
注意:想要拿到類的名稱創建控制器要加上命名空間