學習如何使用Swift寫項目 一.搭建微博項目的主框架 1.1--搭建功能模塊 1.2--在 AppDelegate 中的 didFinishLaunchingWithOptions 函數,設置啟動控制器 1.3--在MainViewController.swift中添加子控制器 二.如何動態的創建 ...
學習如何使用Swift寫項目
一.搭建微博項目的主框架
1.1--搭建功能模塊
1.2--在 AppDelegate
中的 didFinishLaunchingWithOptions
函數,設置啟動控制器
import UIKit import CoreData @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. //創建Window window = UIWindow(frame: UIScreen.mainScreen().bounds) window?.backgroundColor = UIColor.whiteColor() //創建跟控制器 window?.rootViewController = MainViewController() window?.makeKeyWindow() return true } }
1.3--在MainViewController.swift中添加子控制器
override func viewDidLoad() { super.viewDidLoad() //設置當前控制器對應的tabbar的顏色 //註意:在ios7以前如果設置了tintColor志勇文字會變,但圖片不會變 tabBar.tintColor = UIColor.orangeColor() addChildViewController(HomeTableViewController(), title: "首頁", imageName: "tabbar_home") addChildViewController(HomeTableViewController(), title: "消息", imageName: "tabbar_message_center") addChildViewController(HomeTableViewController(), title: "廣場", imageName: "tabbar_discover") addChildViewController(HomeTableViewController(), title: "我", imageName: "tabbar_profile") } /** 初始化子控制器 - parameter childController: 需要初始化的子控制器 - parameter title: 子控制器的標題 - parameter imageName: 子控制器的圖片名字 */ private func addChildViewController(childController: UIViewController, title:String, imageName:String) { //設置控制器tabar對應的數據 childController.tabBarItem.image = UIImage(named: imageName) childController.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") childController.title = title //2.給控制器包裝一個導航欄控制器 let nav = UINavigationController() nav.addChildViewController(childController) //3.將導航欄控制器添加到當前控制器上 addChildViewController(nav) }
二.如何動態的創建控制器,在需求中可能遇到---在節假日中修改標簽欄按鈕的圖標,這時就需要動態的創建控制器
2.1在項目中創建一個Json類MainVCSettings.json
[ { "vcName": "HomeTableViewController", "title": "首頁", "imageName": "tabbar_home" }, { "vcName": "MessageTableViewController", "title": "消息", "imageName": "tabbar_message_center" }, { "vcName": "DiscoverTableViewController", "title": "廣場", "imageName": "tabbar_discover" }, { "vcName": "ProfileTableViewController", "title": "我", "imageName": "tabbar_profile" } ]
2.1 具體實現代碼
override func viewDidLoad() { super.viewDidLoad() //設置當前控制器對應的tabbar的顏色 //註意:在ios7以前如果設置了tintColor志勇文字會變,但圖片不會變 tabBar.tintColor = UIColor.orangeColor() //1.獲取json文件的路徑 let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil) //2.通過文件路徑創建NSData if let jsonPath = path{ let jsonData = NSData(contentsOfFile: jsonPath) do{ //可能發生的異常代碼放到這裡 //序列話json數據->Array //Try:發生異常會跳到catch中繼續執行 //Try! :發生一次程式直接崩潰 let dictArr = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers) //遍曆數組,動態創建控制器和設置數據 //在Swift中,如果需要遍歷一個數組,必須明確數據的類型 for dict in dictArr as! [[String: String]] { //報錯的原因是因為addChildViewController參數必須有值,但是字典的返回值是可選類型 addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!) } } catch { //發生異常之後會執行的代碼 print(error) //從本地創建控制器 addChildViewController("HomeTableViewController", title: "首頁", imageName: "tabbar_home") addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center") addChildViewController("DiscoverTableViewController", title: "廣場", imageName: "tabbar_discover") addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile") } } } /** 初始化子控制器 - parameter childController: 需要初始化的子控制器 - parameter title: 子控制器的標題 - parameter imageName: 子控制器的圖片名字 */ private func addChildViewController(childControllerName: String, title:String, imageName:String) { //動態獲取命名空間 let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String //1.將字元串轉換為類 //預設情況下命名空間就是項目的名稱,但是命名空間名稱是可以修改的 let cls:AnyClass? = NSClassFromString(ns + "." + childControllerName) //2通過類創建對象 //將AnyClass轉換為指定的類型 let vcCls = cls as! UIViewController.Type //通過class創建對象 let vc = vcCls.init() //設置控制器tabar對應的數據 vc.tabBarItem.image = UIImage(named: imageName) vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") vc.title = title //2.給控制器包裝一個導航欄控制器 let nav = UINavigationController() nav.addChildViewController(vc) //3.將導航欄控制器添加到當前控制器上 addChildViewController(nav) }
三.創建微博中間加號按鈕
override func viewDidLoad() { super.viewDidLoad() //設置當前控制器對應的tabbar的顏色 //註意:在ios7以前如果設置了tintColor志勇文字會變,但圖片不會變 tabBar.tintColor = UIColor.orangeColor() //添加子控制器 addChildViewControllers() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) // 此時 tabBarButton 都已經創建 print(tabBar.subviews) // 初始化加號按鈕 setupComposeBtn() } //添加子控制器 func addChildViewControllers(){ //1.獲取json文件的路徑 let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil) //2.通過文件路徑創建NSData if let jsonPath = path{ let jsonData = NSData(contentsOfFile: jsonPath) do{ //可能發生的異常代碼放到這裡 //序列話json數據->Array //Try:發生異常會跳到catch中繼續執行 //Try! :發生一次程式直接崩潰 let dictArr = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers) //遍曆數組,動態創建控制器和設置數據 //在Swift中,如果需要遍歷一個數組,必須明確數據的類型 for dict in dictArr as! [[String: String]] { //報錯的原因是因為addChildViewController參數必須有值,但是字典的返回值是可選類型 addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!) } } catch { //發生異常之後會執行的代碼 print(error) //從本地創建控制器 addChildViewController("HomeTableViewController", title: "首頁", imageName: "tabbar_home") addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center") // 添加占位控制器 addChildViewController("PlusViewController", title: "", imageName: "") addChildViewController("DiscoverTableViewController", title: "廣場", imageName: "tabbar_discover") addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile") } } } private lazy var composeBtn:UIButton = { // 1.創建按鈕 let button = UIButton() // 2.設置圖片 button.setImage(UIImage(named: "tabbar_compose_icon_add"), forState: UIControlState.Normal) button.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), forState: UIControlState.Highlighted) // 3.設置背景圖片 button.setBackgroundImage(UIImage(named: "tabbar_compose_button"), forState: UIControlState.Normal) button.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), forState: UIControlState.Highlighted) // 4.添加監聽 button.addTarget(self, action: "composetBtnClick", forControlEvents: UIControlEvents.TouchUpInside) // 5.添加到tabBar上 // Swift中能不寫self就不寫self, 在閉包中必須寫self // self.tabBar.addSubview(button) // 6.返回按鈕 return button }() // 運行迴圈監聽到事件後,向 VC 發送消息,動態執行 方法,因此不能設置為 private func composetBtnClick() { print(__FUNCTION__) } /** 初始化子控制器 - parameter childController: 需要初始化的子控制器 - parameter title: 子控制器的標題 - parameter imageName: 子控制器的圖片名字 */ private func addChildViewController(childControllerName: String, title:String, imageName:String) { //動態獲取命名空間 let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String //1.將字元串轉換為類 //預設情況下命名空間就是項目的名稱,但是命名空間名稱是可以修改的 let cls:AnyClass? = NSClassFromString(ns + "." + childControllerName) //2通過類創建對象 //將AnyClass轉換為指定的類型 let vcCls = cls as! UIViewController.Type //通過class創建對象 let vc = vcCls.init() //設置控制器tabar對應的數據 vc.tabBarItem.image = UIImage(named: imageName) vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") vc.title = title //2.給控制器包裝一個導航欄控制器 let nav = UINavigationController() nav.addChildViewController(vc) //3.將導航欄控制器添加到當前控制器上 addChildViewController(nav) } /** 設置加號按鈕位置 */ private func setupComposeBtn(){ // 0.添加到tabBar上 tabBar.addSubview(composeBtn) // 1.計算按鈕寬度 let width = tabBar.bounds.width / CGFloat(viewControllers!.count) // 2.創建按鈕frame let rect = CGRect(x: 0, y: 0, width: width, height: tabBar.bounds.height) // 3.設置按鈕frame和偏移位 composeBtn.frame = CGRectOffset(rect, width * 2, 0) }