怎樣下降iOS代碼耦合性

綜述

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

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

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

Storyboard與代碼耦合性

若是放在兩年前去討論iOS工程要不要使用Stortboard進行佈局,咱們可能還會猶豫一下,不少iOS程序猿心裏會有一種想把一切化爲代碼掌控在手中的想法,選擇拒絕使用Storyboard或者更早的xib。但事到現在,iPhone、iPad的屏幕尺寸愈來愈多,工程裏爲了適配不一樣屏幕冗餘代碼愈來愈長的時候,Storyboard彷佛成爲了咱們必須同時也是蘋果公司在引導咱們將要實踐的方向。數據庫

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

這裏經過三個方面介紹經過使用Storyboard減少工程代碼耦合性的途徑:網絡

  • IBDesignableIBInspectable
  • 預覽Storyboard Preview
  • NSObjectRuntime Attributes

IBDesignable和IBInspectable

IBDesignableIBInspectable的出現爲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的參數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): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.

Storyboard小結

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

相關文章
相關標籤/搜索