在互連網上關於Interface Builder的爭吵每天都在發生,用和不用大家都有一大堆的理由。最近看了這篇文章,很多地方和作者有共鳴,結合自己的一些經曆,就有了你現在所看到的東西,你可以把它當成前者的中文版。
一年前我開始做iOS開發,看的是Stanford的CS 193P。老頭子推薦新手用Storyboard來做開發,因為它是可視化的,不太需要瞭解代碼層的東西就能拖出介面,各種配置項可以通過勾選搞定,省去很多代碼,相當傻瓜,此外Storyboard也讓人對應用程式的活動流程一目瞭然。我對這種拖拽式的編程方式很不習慣:這不是代碼出奇蹟的節奏啊!
我開始做實際的項目。看了幾個開源項目的代碼後,我知道舊時代有個xib
格式的檔案。這貨是Interface Builder的產物,現在我們稱他們為NIB。用法和Storyboard差不多,可視化拖拽、配置。Storyboard比較新,業界用的人不多,於是我很糾結,到底是聽老頭子的話用新東西,還是隨大流試試單獨的NIB?初生牛犢不怕虎,反正沒怎麼做過iOS開發,就按課上說的來吧,我們團隊用Storyboard拖UI。一個月後,我提議棄用Interface Builder,不用任何NIB(包括Storyboard)。直到現在只要是在我控制範圍內,我都沒再碰過任何NIB,我更願意用代碼來產生。
不用Interface Builder的理由很多,對我來說主要有一下幾點:
多人協作
從專案管理的角度來講NIB就不應該被使用。你能保證自己從來不會在合并NIB時出現衝突嗎?在一個稍有規模,多開發人員的項目裡,合并NIB簡直就是夢魘。特別是多人共用一個Storyboard時,開發人員將花費很多時間和精力去解決衝突,而不是去做比這更有意義的事。
當然,如果最終合并結果正確可信,那麼很多同學還是可以忍受的。然而,合并畢竟是會出問題的,尤其是用Git自動合并。這些問題直到運行時才會出現!倘使測試力度不夠,這就是潛在的隱患。此外,我們知道NIB是人不可讀的,也就是說,對它做版本控制幾乎沒有意義。你沒法從diff看出來半點鐘名堂。倘使你使用的不是NIB,而是一行一行的Objective-C代碼,那麼結果會好很多。
選擇顯式而非隱式
我喜歡用代碼來完成各種東西,這樣你開啟一個view或者一個view controller,就能看到所有東西。否則,看你代碼的這位同學還得去找相應的NIB。
NIB同樣也是滋生bug的溫床,很多時候你調試了半天才發現,某個bug並不是出在自己的代碼裡,而是在Interface Builder的某個小角落裡自己忘記給某個選項打上√。如果所有的組件都由代碼產生,那麼在調試時就簡單得多,你只要專註於和View有關的代碼就快好了。選擇顯式地在代碼裡寫view,可以讓你對view有強大的控制力。從初始化到布局、繪製你都能插手,在代碼裡你清楚地知道某個view的各個屬性會是多少,而非交由Interface Builder來管理,這樣雖然看上去程式碼數多了,但它幫你減少了bug數量,節省了debug時間。
耦合
用Interface Builder去建立可複用的view會是一件很蛋疼的事。首先你需要拖拽出各種各樣的組件,然後給每個組件設定屬性,接著你要把outlet串連到要用到的代碼塊……某一次,你忘記連outlet,然後你的程式就在runtime crash了。看,你又弄出了一堆bug。對於各種零碎的view我更喜歡為他們寫類,然後在裡面實現各種我想要的東西,在需要用到這些view的時候產生對象就是了。如果我有什麼錯誤,編譯器大哥還能幫我檢查。
使用NIB讓我提心弔膽,它讓程式變得不那麼緊湊。很多需要內聚的東西,被分了出去。從實際的開發體驗來講就是東一塊,西一塊,切來切去我都覺得煩。一旦當你定製的view越來越多,NIB就增多,然後呵呵。
布局
我承認自己幾乎沒在Interface Builder用過各種layout(包括auto-layout)。我不清楚用NIB做layout是否困難。但我知道重寫UIView
的layoutSubviews
讓布局變得很簡單。所有子項目的布局只要在這裡設定就行了。需要重新布局時,調一下setNeedsLayout
就行。不用關心什麼Interface Builder裡各種layout概念,不用把布局代碼分地方寫(降低耦合)。只要稍加判斷,讓同一個view適應iPhone和iPad不是什麼難事。給iPad和iPhone分別提供NIB這種事簡直不能忍。
本地化
當IB遇到本地化會發生什麼呢?我屮艸芔茻!只要涉及本地化的NIB,都要你去投時間和體力做啊。點滑鼠啊,設定啊,純體力活!如果用代碼,字串用NSLocalizedString(@"Localizable String", @"Comment")
,然後在資源檔裡翻譯一下,輕輕鬆鬆。
小結
Interface Builder的初衷可能是希望協助開發人員節省寫介面的時間和精力。可視化,表現層和資料分離都是很好的思想。但它在目前還不讓人滿意。它讓多人協作變得困難,誘導拙劣的實踐,降低可複用性,讓你開發變慢……
我如果能不用IB,就不用,作為一名程式員更應該用代碼說話。從裝逼角度來講,這樣才顯得高端大氣上檔次不是嗎?
轉:http://blog.xianqu.org/2013/06/why-i-dont-use-interface-builder/