1. 程式人生 > >Swit專案-初始化配置

Swit專案-初始化配置

一、專案部署+配置

 

二、初始化專案

①常規初始化

class MainViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //1.建立TabBar第一種方法
        addChildViewController( "HomeViewController",  "首頁",  "tabbar_home")
         addChildViewController( 
"MessageViewController", "訊息", "tabbar_message_center") addChildViewController( "DiscoverViewController", "發現", "tabbar_discover") addChildViewController( "ProfileViewController", "我", "tabbar_profile") } // swift支援方法的過載 // 方法的過載:方法名稱相同,但是引數不同. --> 1.引數的型別不同 2.引數的個數不同
// private在當前檔案中可以訪問,但是其他檔案不能訪問 private func addChildViewController(_ childVcName: String, _ title : String, _ imageName : String) { // 0.獲取名稱空間(Swift 類名格式: 主工程.類名 - WeiBo.HomeViewController) guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else
{ print("沒有獲取名稱空間") return } // 1.根據字串獲取對應的Class guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else { print("沒有獲取到字串對應的Class") return } // 2.將對應的AnyObject轉成控制器的型別 guard let childVcType = ChildVcClass as? UIViewController.Type else { print("沒有獲取對應控制器的型別") return } // 3.建立對應的控制器物件 let childVc = childVcType.init() // 4.設定子控制器的屬性 childVc.title = title childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName) childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted") // 5.包裝導航欄控制器 let childNav = UINavigationController(rootViewController: childVc) // 6.新增控制器 addChild(childNav) } }

②json檔案動態初始化

class MainViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //2.通過json檔案建立VC,動態初始化TabBarController
        // 1.獲取json檔案路徑
        guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else {
            print("沒有獲取到對應的檔案路徑")
            return
        }
        
        // 2.讀取json檔案中的內容
        guard let jsonData = NSData(contentsOfFile: jsonPath) else {
            print("沒有獲取到json檔案中資料")
            return
        }
        
        guard let anyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else {
            return
        }
        
        guard let dictArray = anyObject as? [[String : AnyObject]] else {
            return
        }
        
        // 4.遍歷字典,獲取對應的資訊
        for dict in dictArray {
            // 4.1.獲取控制器的對應的字串
            guard let vcName = dict["vcName"] as? String else {
                continue
            }
            
            // 4.2.獲取控制器顯示的title
            guard let title = dict["title"] as? String else {
                continue
            }
            
            // 4.3.獲取控制器顯示的圖示名稱
            guard let imageName = dict["imageName"] as? String else {
                continue
            }
            
            // 4.4.新增子控制器
            addChildViewController(vcName, title, imageName)
        }
        
    }
    
    // swift支援方法的過載
    // 方法的過載:方法名稱相同,但是引數不同. --> 1.引數的型別不同 2.引數的個數不同
    // private在當前檔案中可以訪問,但是其他檔案不能訪問
    private func addChildViewController(_ childVcName: String, _ title : String, _ imageName : String) {
        
        // 0.獲取名稱空間(Swift 類名格式: 主工程.類名 - WeiBo.HomeViewController)
        guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
            print("沒有獲取名稱空間")
            return
        }
        
        // 1.根據字串獲取對應的Class
        guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {
            print("沒有獲取到字串對應的Class")
            return
        }
        
        // 2.將對應的AnyObject轉成控制器的型別
        guard let childVcType = ChildVcClass as? UIViewController.Type else {
            print("沒有獲取對應控制器的型別")
            return
        }
        
        // 3.建立對應的控制器物件
        let childVc = childVcType.init()
        
        // 4.設定子控制器的屬性
        childVc.title = title
        childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName)
        childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted")
        
        // 5.包裝導航欄控制器
        let childNav = UINavigationController(rootViewController: childVc)
        
        // 6.新增控制器
        addChild(childNav)
    }

}

三、異常處理方式

將Data轉成陣列

 如果在呼叫系統某一個方法時,該方法最後有一個throws.說明該方法會丟擲異常.如果一個方法會丟擲異常,那麼需要對該異常進行處理

在swift中提供三種處理異常的方式

方式一:try方式 程式設計師手動捕捉異常

               do {
                    try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
                } catch {
                    // error異常的物件
                    print(error)
                }

方式二:try?方式(常用方式) 系統幫助我們處理異常,如果該方法出現了異常,則該方法返回nil.如果沒有異常,則返回對應的物件

                guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
                    return
                }

方式三:try!方法(不建議,非常危險) 直接告訴系統,該方法沒有異常.注意:如果該方法出現了異常,那麼程式會報錯(崩潰)

let anyObject = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)