swift項目第五天:swift中storyBoard Reference搭建主界面

一:StoryBoard Reference的介紹

  • StoryBoard Reference是Xcode7,iOS9出現的新功能
  • 目的是讓咱們能夠更好的使用storyboard來開發項目
    • 在以前的開發中,若是使用一個storyboard開發,那麼很是容易形成代碼衝突
    • 能夠經過使用storyboard建立控制器的方式解決.
    • 官方目前推出了StoryBoard Reference的方式
  • 優勢:
    • 容許你從 segue 中引用其餘 storyboard 中的 viewController
    • 能夠將不一樣模塊放到不一樣Storyboard中
    • 閱讀性好
    • 齊頭並進, 加快開發效率
    • 不容易出現SVN/GIT錯誤

如何使用StoryBoard Reference

  • 方式一:
    • 1.選中須要的控制器
    • 2.點擊導航條Editor
    • 3.選擇下拉菜單Refactor to storyboard
  • 方式二:
    • 1.在控件庫中拖入Storyboard References
    • 2.新建一個Storyboard
    • 3.關聯新建的storyboard到Storyboard References

純代碼和Storyboard如何選擇

  • Storyboard前期開發速度快
  • Storyboard容易重複造輪子
  • 純代碼維護方便


二:StoryBoard Reference搭建界面的效果如圖swift

數組

三:StoryBoard Reference具體使用:閉包

1:先設置啓動Main StoryBoardapp

ide

2:再打開Main StoryBoard,刪除其控制器,拖入一個UItabBarViewController,刪掉其自帶的兩個item,在左側直接選中刪除:並函數

設置啓動控制器:spa

 

3:1:在拖入五個導航控制器,導航控制器自帶根控制器,且根控制器默認爲UITableViewController,能夠刪除UITableViewController裏顯示的cell,cell由本身來建立。再拖線設置UItabBarViewController的根控制器爲每一個導航控制器(選中拖入UItabBarViewController並右擊,選擇ViewController拖向每個拖入的 導航控制器,這樣就設置了UItabBarViewController的根控制器) 2:設置tabBarItem標題圖片 與導航欄標題:在如圖處選中導航控制器,來到右側,可設置導航欄標題,選中與未選中圖片3d

 4: 設置StoryBoard Reference如圖2:1:先選中導航控制器和其根視圖控制器 2:eidtor -- 選中圖中最後一個 3:關聯類:如圖1,code

將相應的storyBoard關聯類,如圖所示orm

 

 

三:在控制器中設置tabbarItem的選中圖片與增減中間按鈕(設置選中圖片能夠在storyBoard中去設置) 

import UIKit

/*
 總結:1:lazy用於懶加載,只能用var來對變量進行懶加載,有兩種方式:1:lazy var first = NSArray(objects: "1","2")  2:閉包形式:
 lazy var second:String = {
    return "second"
 }()
 例子:
   lazy var imageArr = ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"]
 
 
 lazy var imageArr = {
 
 return ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"]
 }();
 
     2:1:設置tabbaritem的代碼都必須放在viewWillAppear裏,如果在viewDidLoad裏,則設置好的item又會在viewWillAppear方法裏被系統調整回來 2:for循環遍歷,1:要是想得到下標值就用區間遍歷 for i in 0..<tabBar.items!.count {}(tabBar.items是一個可選類型,能保證其必定有值,因此能夠進行!強制解包,根據i值能夠從懶加載的數組中取出對應元素)2:如果不想得到下標值,只想得到懶加載數組中的元素值,能夠直接遍歷,for item in tabBar.items!{} 2:swift中的布爾值用Bool來表示,有true 和 false兩種,設置按鈕不可點擊,btn.isEnabled =  false,與for循環經常使用的有continue,跳過本次循環,不執行下面的代碼,當即執行下一個循環,break當即終止循環,return,也是當即返回,不執行return下面的代碼。
     3:要想類中定義的屬性不但願外界來訪問,就定義爲private,或是fileprivate,private修飾的屬性方法,只能在當前類中訪問,在同一個文件中定義不一樣的類就不能在訪問另外一個類中private修飾的方法或是屬性,可是屬性或是方法用fileprivate能夠在當前文件任何類中進行訪問
 
 */
class RHTabBarViewController: UITabBarController {
    
//    lazy var imageArr = ["tabbar_home_highlighted","tabbar_message_center_highlighted","tabbar_discover_highlighted","tabbar_profile_highlighted"]
    
    
    ///1:懶加載圖片數組
    fileprivate  lazy var imageArr = {
    return ["tabbar_home_highlighted","tabbar_message_center_highlighted","","tabbar_discover_highlighted","tabbar_profile_highlighted"]
    }();
    
    ///2:懶加載中間按鈕
    fileprivate lazy var centerButton = UIButton()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
         //MARK:-2:添加中間按鈕
          setupCenterButton()
        
        
    }
    
    
    override func viewWillAppear(_ animated: Bool) {
        
        super.viewWillAppear(animated)
        
        //MARK:-1:設置tabbarItem的高亮圖片
         setupTabbarItems()
        
    }
}

/**
 
 總結:1:extension表示擴展,在定義的類中:RHTabBarViewController,設置該類的擴展,extension RHTabBarViewController {},如果該類有遵照協議關係的時候,繼承的協議就在RHTabBarViewController後面加:後面寫遵照的協議 2:通常extension擴展用於在某個類中封裝方法,在viewDidLoad方法中抽方法封裝調用,將封裝的方法寫在extension的擴展類中,在viewDidLoad直接調用
    
     2:通常在聲明的類class中定義屬性:1:private,或是filePrivate來修飾,而且通常採用懶加載(1:直接初始化 2:閉包懶加載,{return:一個值}()),若不是懶加載,定義屬性變量的時候,必須定義初始化有值,要不定義成可選類型,在後面進行賦值,不然會被報錯。 2:在viewDidload中抽方法封裝調用,將封裝的方法寫在extension的擴展類中,在定義方法的時候,也是private,fileprivate來選擇修飾,定義有返回值或是無返回值的函數。2:定義的函數中涉及到外部參數與內部參數:在swift中第一個參數默認爲內部參數,_+空格+參數名組成,默認從第二個參數開始,既是外部參數又是內部參數,如果想讓某個參數成爲內部參數,就直接在函數中用_+空格+參數名修飾就能夠 3:函數的默認參數,在封裝的函數中,也能夠給參數設定默認參數,則此時,外部調用就不會顯示默認參數,而在參數內部本身能夠拿到默認參數的值:如定義的全局打印:fileName:String = #file
   
 func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) {
 
 #if DEBUG
 
 let file = (fileName as NSString).lastPathComponent;
 
 print("\(file):\(funcName):\(lineNum):\("打印內容"):\(message)")
 
 #endif
 
 }
 
    3:設置tabbar上的高亮圖片:1:tabBar.items爲一個可選類型的數組,可是能保證其必定有值,因此能夠進行強制解包,如果可選類型的變量能肯定必定有值的話就對其進行強制解包 2:建立UIImage的對象:item.selectedImage = UIImage(named: imageArr[i])
 
    4:添加中間的加號按鈕:1:懶加載完控件後,首先在方法中將控件添加到父控件中,在同一個類中屬於該類的方法能夠不去調用self,tabBar.addSubview(centerButton) 2:設置按鈕的背景圖片centerButton.setBackgroundImage, centerButton.setImage,第二個參數爲一個枚舉值,枚舉值調用就用點語法調用枚舉類型,.normal,.highlighted 3:設置按鈕的frame:centerButton.sizeToFit()
        讓按鈕的大小等於按鈕內容的大小。設置center的時候,設置的是tabbar的centerx,中心點y值爲tabba高度的一半
 */
extension RHTabBarViewController {
    
   ///1:添加中間的加號按鈕
  fileprivate  func setupCenterButton() {
        
    //1:添加按鈕
    tabBar.addSubview(centerButton)
        
    //2:設置圖片
    centerButton.setBackgroundImage(UIImage(named: "tabbar_compose_button"), for: .normal)
    centerButton.setBackgroundImage(UIImage(named:"tabbar_compose_button_highlighted"), for: .highlighted)
    centerButton.setImage(UIImage(named:"tabbar_compose_icon_add"), for: .normal)
    centerButton.setImage(UIImage(named:"tabbar_compose_icon_add_highlighted"), for: .highlighted)
    
    //3:設置frame
    centerButton.sizeToFit()
    centerButton.center = CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5)
        
    }
    
    ///2:設置的是tabbar上的高亮圖片
    fileprivate func setupTabbarItems() {
        
        for i in 0..<tabBar.items!.count {
            
            let item = tabBar.items![i]
            if i == 2 {
                
                item.isEnabled = false
                continue
            }
            
            item.selectedImage = UIImage(named: imageArr[i])
            
        }
        
    }
    
}
相關文章
相關標籤/搜索