Swift學習--微博的基礎框架搭建

来源:http://www.cnblogs.com/llhui/archive/2016/04/20/5412605.html
-Advertisement-
Play Games

學習如何使用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)
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. F ...
  • 一、事務併發會遇到的幾個問題: 1)臟讀 :兩個事務同時操作同一數據,A事務對該數據進行了修改還沒提交的時候,B事務訪問了該條事務,並且使用了該數據,此時A事務回滾,那麼B事務讀到的就是臟數據。 比如事務1,修改了某個數據 事務2,剛好訪問了事務1修改後的數據 此時事務1,回滾了操作 事務2,讀到還 ...
  • 對於集合框架,是非常重要的知識,是程式員必須要知道的知識點。 但是我們為什麼要引入集合框架呢? 我們之前用過數組存儲數據,但是採用數組存儲存在了很多的缺陷。而現在我們引用了集合框架,可以完全彌補了數組的缺陷。它靈活,使用,提高軟體的開發效率。並且不同的集合適用於不同的場合。 集合框架的好處: 1.容 ...
  • 本教程自從發佈以來,已經被下載了2000多萬次,創造了國內視頻教程的記錄。該教程是尚學堂老師上課時真實錄製而成, 充分展現了講師的風采,高超的技術、幽默的授課風格、深入淺出的分析。 本教程從最基本的數據類型開始講解,直到多線程等技術要點,很多要點都做了記憶體分析,真正做到了深入淺出,讓學習者 更容易入 ...
  • 最近在研究pathon的命令行解析工具,argparse,它是Python標準庫中推薦使用的編寫命令行程式的工具。 以前老是做UI程式,今天試了下命令行程式,感覺相當好,不用再花大把時間去研究界面問題,尤其是vc++中尤其繁瑣。 現在用python來實現命令行,核心計算模塊可以用c自己寫擴展庫,效果 ...
  • DataType patternset fileset selector filelist path regexp patternset fileset selector filelist path regexp Ant datatype Ant中,除了Property可以做為Task執行時使用的值 ...
  • 序幕 其實環境搭建沒什麼難的,但是遇到一些問題,主要是有些網站資源訪問不了(如:golang.org), 導致一些包無法安裝,最終會導致環境搭建失敗,跟據這個教程幾步,我們將可以快速的構建golang的開發環境。 開發環境: 一、安裝 這裡我用需要安裝一些工具: 1. "Visual Studio ...
  • 在JDBC應用中,如果你已經是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.也就是說,在任何時候都不要使用Statement一.代碼的可讀性和可維護性.雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...