ios開發 為什麼不用Interface builder

beifengwang發表於2013-10-16


一年前我開始做iOS開發,看的StanfordCS193P老頭子推薦新手用Storyboard來做開發,因為它視覺化的不太需要了解程式碼層的東西就能拖出介面,各種配置項可以透過勾選搞定,省去很多程式碼,相當傻瓜,此外Storyboard也讓人對應用程式的活動流程一目瞭然。對這種拖拽式的程式設計方式很不習慣:這不是程式碼出奇跡的節奏啊!

開始做實際的專案。看了幾個開源專案的程式碼後,知道舊時代有個xib格式的檔案。這貨是InterfacBuilder產物,現在稱他為NIB用法和Storyboard差不多,視覺化拖拽、配置。Storyboard比較新,業界用的人不多,於是很糾結,底是聽老頭子的話用新東西,還是隨大流試試單獨的NIB初生牛犢不怕虎,反正沒怎麼做過iOS開發,就按課上說的來吧,團隊用Storyboard拖UI一個月後,提議棄用InterfacBuilder不用任何NIB包括Storyboard直到現在只要是控制範圍內,都沒再碰過任何NIB更願意用程式碼來生成。

不必InterfacBuilder理由很多,對我來說主要有一下幾點:

多人協作
從專案管理的角度來講NIB就不應該被使用。能保證自己歷來不會在合併NIB時出現牴觸嗎?一個稍有規模,多開發者的專案裡,合併NIB簡直就是夢魘。特別是多人共用一個Storyboard時,開發者將花費很多時間和精力去解決衝突,而不是去做比這更有意義的事。

當然,如果最終合併結果正確可信,那麼很多同學還是可以忍受的然而,合併終究是會出問題的尤其是用Git自動合併。這些問題直到執行時才會出現!倘使測試力度不夠,這就是潛在隱患。此外,知道NIB人不可讀的也就是說,對它做版本控制幾乎沒有意義。沒法從diff看出來半點名堂。倘使你使用的不是NIB而是一行一行的Objective-C程式碼,那麼結果會好很多。

選擇顯式而非隱式
喜歡用程式碼來完成各種東西,這樣你開啟一個view或者一個viewcontrol就能看到所有東西。否則,看你程式碼的這位同學還得去找相應的NIB

NIB同樣也是滋生bug溫床,很多時候你除錯了半天才發現,某個bug並不是出在自己的程式碼裡,而是InterfacBuilder某個小角落裡自己忘記給某個選項打上√。如果所有的元件都由程式碼生成,那麼在除錯時就簡單得多,只要專注於和View有關的程式碼就快好了選擇顯式地在程式碼裡寫view可以讓你對view有強大的控制力。從初始化到佈局、繪製你都能插手,程式碼裡你清楚地知道某個view各個屬性會是多少,而非交由InterfacBuilder來管理,這樣雖然看上去程式碼行數多了但它幫你減少了bug數量,節省了debug時間。

耦合
用InterfacBuilder去建立可複用的view會是一件很蛋疼的事。首先你需要拖拽出各種各樣的元件,然後給每個元件設定屬性,接著你要把outlet連線到要用到程式碼塊…某一次,忘記連outlet然後你順序就在runtimcrash看,又弄出了一堆bug對於各種零碎的view更喜歡為他寫類,然後在裡面實現各種我想要的東西,需要用到這些view時候生成物件就是如果我有什麼錯誤,編譯器大哥還能幫我檢查。

使用NIB讓我提心吊膽,讓順序變得不那麼緊湊。很多需要內聚的東西,被分了進來。從實際的開發體驗來講就是東一塊,西一塊,切來切去我都覺得煩。一旦當你定製的view越來越多,NIB就增多,然後呵呵。

佈局
供認自己幾乎沒在InterfacBuilder用過各種layout包括auto-layout不清楚用NIB做layout否困難。但我知道重寫UIViewlayoutSubviews讓佈局變得很簡單。所有子元素的佈局只要在這裡設定就行了需要重新佈局時,調一下setNeedsLayout就行。不用關心什麼InterfacBuilder裡各種layout概念,不用把佈局程式碼分地方寫(降低耦合)只要稍加判斷,讓同一個view適應iPhon和iPad不是什麼難事。給iPad和iPhon分別提供NIB這種事簡直不能忍。

外地化
當IB遇到外地化會發生什麼呢?屮艸芔茻!只要涉及外地化的NIB都要你去投時間和體力做啊。點滑鼠啊,設定啊,純體力活!如果用程式碼,字串用NSLocalizedStr@"LocalizString",@"Comment"然後在資原始檔裡翻譯一下,輕輕鬆鬆。

小結
InterfacBuilder初衷可能是希望協助開發者節省寫介面的時間和精力。視覺化,表示層和資料分離都是很好的思想。但它目前還不讓人滿意。讓多人協作變得困難,誘導拙劣的實踐,降低可複用性,讓你開發變慢…

如果能不用IB就不用,作為一名順序員更應該用程式碼說話。從裝逼角度來講,這樣才顯得高階大氣上檔次不是嗎?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29212814/viewspace-774438/,如需轉載,請註明出處,否則將追究法律責任。

相關文章