如何在Xcode 8中更好地使用StoryBoard

蘋果在Xcode 8中為 Interface Builder 的界面做了非常偉大的改善,Size Classes 變得更加直觀,StoryBoard的使用也變得更加的便利,還有一個完整度驚人的 Interface Builder 預覽界面,這對于那些對 interface Builder 的使用猶豫不決的人來說, 可能成為巨大的沖擊。

在另一方面, 許多開發者在使用Interface Builder的時候仍然有一些麻煩, 尤其是在構建一個巨大的包含復雜導航的多屏幕應用的時候。

在這篇文章里, 我將分享給你一些處理項目里面的 StroyBoards 和 Nibs 的好建議,如果你還沒有用過Interface Builder, 或者你正打算使用這個工具,那么這些建議可能對你很有用。

1. 如果是團隊協作開發, 請為每一個屏幕使用一個單獨的 StoryBoard,如果你是獨立工作, 這依舊是一個好的習慣。

你在項目里是不是有一個類似于這樣的main.storyboard?

但是這對于開發者來說, 就可能會存在很多問題:


源碼控制: StoryBoard 非常難解決合并時候產生的沖突, 所以單獨的StoryBoard會使你在團隊工作中變得更加輕松。

StoryBoard文件會變得非常臃腫和難以駕馭,你有多少次因為點錯而無意中改變了ViewController的約束?

你需要為每一個ViewController分配一個StoryBoard的ID, 這非常容易出錯: 因為你每次使用這個veiwcontroller的時候都要硬編碼這個ID。

如何連接項目里面的不同的StoryBoard? 這里有兩種方法:


使用Xcode7中所提供的StoryBoard Reference方案

通過代碼來連接StoryBoard

你可以點擊這里來閱讀關于第一種方法的更多的內容。


我將要介紹第二種方法, 因為它在復雜的項目中非常的常見。


2. StoryBoard文件與相關的ViewController subclass使用相同的名稱。


這將簡化命名的約定, 并且提供給你一些與第三條建議相關的好處。

 在UIViewController subclass中初始化StoryBoard.


在初始化StoryBoard的Base ViewController的代碼中, 我經??吹較旅嬲庋拇?

let storyboard = UIStoryboard(name: “Main”, bundle: nil)

let homeViewController = storyboard.instantiateViewController(withIdentifier: “HomeViewController”)

這看起來一點都不清晰: 你需要知道這個StoryBoard的名字, 還需要提供這個ViewController在StoryBoard中的ID, 而且你在創建HomeViewController時, 每次都要使用這種方式。


這有一個更好的方式讓你用代碼在ViewController中使用類方法來初始化它和它所在的StoryBoard:


1

2

3

4

5

6

7

8

class HomeViewController: UIViewController {

     static func storyboardInstance() -> HomeViewController? { 

         let storyboard = UIStoryboard(name: String.className(self), 

                                       bundle: nil) return 

         storyboard.instantiateInitialViewController() as?   

                                                 HomeViewController 

     }

}

如果你按照之前的建議來操作, 你就可以避免硬編碼 StoryBoard 的名稱和實體類的名稱.


1

let StoryBoard = UIStoryBoard(name: String.className(self), bundle: nil)

確保你的StoryBoard的名稱和實體類的名稱完全相同,否則,當視圖引用這個StoryBoard時, 應用程序會崩潰.


這使你代碼的可讀性更高, 而且可以降低出錯率:


class HomeViewController: UIViewController {

     static func StoryBoardInstance() -> HomeViewController? { 

         let StoryBoard = UIStoryBoard(name: String.className(self), 

                                       bundle: nil) return 

         StoryBoard.instantiateInitialViewController() as?   

                                                 HomeViewController 

     }

}

如果你想通過 instantiateInitialViewController()來訪問ViewController, 請確保你在Interface Builder中設置這個ViewController為initialViewController . 如果你在相同的StoryBoard中有多個ViewController, 那么你需要使用instantiateViewController(withIdentifier: _ )

初始化這個ViewController的時候僅需要這一句代碼:

let homeViewController = HomeViewController.StoryBoardInstance(


上一篇: 如何加快XCode編譯速度?

下一篇: iOS開發進階 - 項目的本地化處理(多語言開發)

分享到: 更多
压单双大小还有时时彩 时时彩开奖号码 广东时时交流群 pk10五码必中计划群 彩红时时彩计划软件苹果系统 下载麻将游戏免费四人 百人牛牛最新版下载 快速时时开奖记录 江苏快三计划软件手机版 现金斗牛20元提现下载 重庆时时最新开奖结果 盛兴秒速时时开奖号码 大乐透最近30期走势图综合板 四人麻将 安徽时时qq群 时时彩追热号技术