在互聯網上關於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時,開發者將花費不少時間和精力去解決衝突,而不是去作比這更有意義的事。ui
固然,若是最終合併結果正確可信,那麼不少同窗仍是能夠忍受的。然而,合併畢竟是會出問題的,尤爲是用Git自動合併。這些問題直到運行時纔會出現!倘使測試力度不夠,這就是潛在的隱患。此外,咱們知道NIB是人不可讀的,也就是說,對它作版本控制幾乎沒有意義。你無法從diff看出來半點名堂。倘使你使用的不是NIB,而是一行一行的Objective-C代碼,那麼結果會好不少。翻譯
我喜歡用代碼來完成各類東西,這樣你打開一個view或者一個view controller,就能看到全部東西。不然,看你代碼的這位同窗還得去找相應的NIB。debug
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就增多,而後呵呵。code
我認可本身幾乎沒在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/