關于ObjC代碼耦合性的閑扯

綜述

凡是維護過中型項目的iOS工程師都應該有過類似的體驗:ViewController代碼繁重、功能復雜、維護困難,整個工程寥寥幾個ViewController就完成了整個項目的開發。每個控制器中都囊括了所有的頁面布局、委托代理、網絡請求、數據庫操作和核心功能,這樣的代碼往往問題重重,修改起來牽一發而動全身,著實令人頭疼。

為了應對這一系列的問題,蘋果公司的工程師給我們提供了很多選擇去更好的在項目工程中貫徹MVC的設計理念,例如使用從前的Interface Builder制作xib可視布局,現在已經內置到xcode里面,并且提供了更為強大Storyboard功能,來減少控制器中的頁面樣式布局代碼量;再例如NSFetchedResultsController這樣的類和CoreDataheUITableViewController的完美結合,大大減少類似構架項目的代碼量,并且穩定高效。

這些技巧在objc.io上有一個專門的專題,推薦給大家對應中文站objc中國,感謝objc 中國項目組。

Storyboard與代碼耦合性

如果放在兩年前去討論iOS工程要不要使用Stortboard進行布局,我們可能還會猶豫一下,很多iOS程序猿內心會有一種想把一切化為代碼掌控在手中的想法,選擇拒絕使用Storyboard或者更早的xib。但事到如今,iPhone、iPad的屏幕尺寸越來越多,工程里為了適配不同屏幕冗余代碼越來越長的時候,Storyboard似乎成為了我們必須同時也是蘋果公司在引導我們將要實踐的方向。

iOS 6中的AutolayoutiOS 8中的Size Class,新技術的涌現正是為了應對更復雜的布局任務。有人可能會反駁說,自動布局也可以用純代碼完成呀。你說的沒錯,純代碼是可以完成,但其復雜程度遠遠不是重寫Frame這么簡單了,更靈活地將Storyboard和代碼結合,才是比較完備的解決方案。

這里通過三個方面介紹通過使用Storyboard減小工程代碼耦合性的途徑:

  • IBDesignableIBInspectable
  • 預覽Storyboard Preview
  • NSObjectRuntime Attributes

IBDesignable和IBInspectable

IBDesignableIBInspectable的出現為Storyboard提供了可視化使用高度自定義控件的方法,例子中我們在制作一個雙行標簽控件,用來顯示日期和星期,命名為DateLabel,使用方法如下:

//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的參數dateLabelTextweekLabelText。具體不多介紹了,有點跑題,大家可以參見如何在iOS 8中使用Swift和Xcode 6制作精美的UI組件,同樣適用于Objective-CSwift

引用上文介IBInspectable支持Int,CGFloat,Double,String,Bool,CGPoint,CGSize,
CGRect,UIColor,UIImage等類型的變量。

現在在Github上已經有一部分開源的UI控件使用了這項特性,如此一來,很多需要在代碼中實現的控件自定義特性,都可以在Storyboard中完成,后者的優勢也很明顯:

  1. 所見即所得
  2. 剝離了ViewController中的定制View代碼,減小耦合

預覽Storyboard Preview

Storybord中提供了預覽功能,可以預覽其界面在各個尺寸設備上的真實顯示效果。詳見Xcode 6中學習Swift、CloudKit 和 Testflight,搜索Storyboard Preview

NSObject和Runtime Attributes

大家對這個概念再熟悉不過了,但大家有沒有對他作為一個沒有界面的控件在Storyboard作用產生過疑問呢。先來看下這篇文章 0代碼ViewController的前言。

Storyboard中的NSObject可以是UITableViewDataSource,也可以是MapViewDelegate,連線一下,就能將原本在ViewController中寫得最多的代理方法全部移出,并且,當你需要的時候,這些現成的代理方法,可以直接移到其他的項目中使用。

Runtime Attributes功能則可以在Storyboard中給參數寫好初始值,但這里如果控件沒有對應的參數的話,則會出現下面的報錯。

Failed to set (xxx) user defined inspected property on (xxx): [<xxx 0xXXXXXXXX> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.

Storyboard小結

當你了解了Storyboard的基本原理,就會發現Storyboard是一個很好用的工具,是Model-View-Controller模型中Controller跳轉邏輯和View初始化的實用載體,從根本上把Controller中的導航代碼移出,把頁面配置代碼、觸摸事件甚至協議委托方法分攤到其他實例中,各個類各司其職,整個項目的邏輯也變的更加清晰、更易維護。

轉載請注明出處

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,200評論 4 61
  • -01- 我曾經有段時間特別失意,不了解自己要什么,仿佛做什么錯什么,好多自認為的努力都沒得到收獲。 我想你知道,...
    盟夫君閱讀 873評論 7 15
  • NSArray *result = [keyArray sortedArrayUsingComparator:^N...
    sdr小米閱讀 114評論 0 0
  • 秋意微涼 無夢的清晨是潔白的房頂 和透過窗簾的光 對面是石壁千仞 墻外有幾聲雞鳴 我知道,有一只羽毛特別漂亮 離開...
    月亮像銀子閱讀 280評論 0 1
  • 夜闌月落夢相疊 孤星垂際楚獨咽 晨興夜寐素未停 芳華易逝不見卿
    一蓑煙雨n閱讀 254評論 0 1