凡是維護過中型項目的iOS工程師都應該有過相似的體驗:ViewController
代碼繁重、功能複雜、維護困難,整個工程寥寥幾個ViewController
就完成了整個項目的開發。每一個控制器中都囊括了全部的頁面佈局、委託代理、網絡請求、數據庫操做和核心功能,這樣的代碼每每問題重重,修改起來牽一髮而動全身,着實使人頭疼。php
爲了應對這一系列的問題,蘋果公司的工程師給咱們提供了不少選擇去更好的在項目工程中貫徹MVC
的設計理念,例如使用從前的Interface Builder
製做xib
可視佈局,如今已經內置到xcode
裏面,而且提供了更爲強大Storyboard
功能,來減小控制器
中的頁面樣式佈局代碼量;再例如NSFetchedResultsController
這樣的類和CoreData
heUITableViewController
的完美結合,大大減小相似構架項目的代碼量,而且穩定高效。html
這些技巧在objc.io上有一個專門的專題,推薦給你們對應中文站objc中國,感謝objc 中國項目組。ios
若是放在兩年前去討論iOS工程要不要使用Stortboard
進行佈局,咱們可能還會猶豫一下,不少iOS程序猿心裏會有一種想把一切化爲代碼掌控在手中的想法,選擇拒絕使用Storyboard
或者更早的xib
。但事到現在,iPhone、iPad的屏幕尺寸愈來愈多,工程裏爲了適配不一樣屏幕冗餘代碼愈來愈長的時候,Storyboard
彷佛成爲了咱們必須同時也是蘋果公司在引導咱們將要實踐的方向。數據庫
從iOS 6
中的Autolayout
到iOS 8
中的Size Class
,新技術的涌現正是爲了應對更復雜的佈局任務。有人可能會反駁說,自動佈局也能夠用純代碼完成呀。你說的沒錯,純代碼是能夠完成,但其複雜程度遠遠不是重寫Frame這麼簡單了,更靈活地將Storyboard
和代碼結合,纔是比較完備的解決方案。xcode
這裏經過三個方面介紹經過使用Storyboard
減少工程代碼耦合性的途徑:網絡
IBDesignable
和IBInspectable
Storyboard Preview
NSObject
和Runtime Attributes
IBDesignable
和IBInspectable
的出現爲Storyboard
提供了可視化使用高度自定義控件的方法,例子中咱們在製做一個雙行標籤控件,用來顯示日期和星期,命名爲DateLabel
,使用方法以下:編輯器
objc//IB_DESIGNABLE 標記 IB_DESIGNABLE @interface DateLabel : UIView //IBInspectable 標記 @property (nonatomic, strong) IBInspectable NSString* dateLabelText; @property (nonatomic, strong) IBInspectable NSString* weekLabelText; @end
其中,IB_DESIGNABLE
標記賦予咱們的繼承類DateLabel
能夠在界面編輯器裏面實時渲染的特權。IBInspectable
則賦予讓界面編輯器能夠設置或者預置View
的參數dateLabelText
和weekLabelText
。具體很少介紹了,有點跑題,你們能夠參見如何在iOS 8中使用Swift和Xcode 6製做精美的UI組件,一樣適用於Objective-C
和Swift
。工具
引用上文介
IBInspectable
支持Int
,CGFloat
,Double
,String
,Bool
,CGPoint
,CGSize
,CGRect
,UIColor
,UIImage
等類型的變量。佈局
如今在Github
上已經有一部分開源的UI控件使用了這項特性,如此一來,不少須要在代碼中實現的控件自定義特性,均可以在Storyboard
中完成,後者的優點也很明顯:學習
ViewController
中的定製View
代碼,減少耦合Storybord
中提供了預覽功能,能夠預覽其界面在各個尺寸設備上的真實顯示效果。詳見Xcode 6中學習Swift、CloudKit 和 Testflight,搜索Storyboard Preview
。
你們對這個概念再熟悉不過了,但你們有沒有對他做爲一個沒有界面的控件在Storyboard
做用產生過疑問呢。先來看下這篇文章 0代碼ViewController的前言。
Storyboard
中的NSObject
能夠是UITableView
的DataSource
,也能夠是MapView
的Delegate
,連線一下,就能將本來在ViewController
中寫得最多的代理方法所有移出,而且,當你須要的時候,這些現成的代理方法,能夠直接移到其餘的項目中使用。
Runtime Attributes
功能則能夠在Storyboard
中給參數寫好初始值,但這裏若是控件沒有對應的參數的話,則會出現下面的報錯。
Failed to set (xxx) user defined inspected property on (xxx): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.
當你瞭解了Storyboard
的基本原理,就會發現Storyboard
是一個很好用的工具,是Model-View-Controller
模型中Controller
跳轉邏輯和View
初始化的實用載體,從根本上把Controller
中的導航代碼移出,把頁面配置代碼、觸摸事件甚至協議委託方法分攤到其餘實例中,各個類各司其職,整個項目的邏輯也變的更加清晰、更易維護。