ios開發 為什麼不用Interface builder
一年前我開始做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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS Autolayout 介紹 2 Interface Builder 技巧iOSUI
- 不用jb,該用什麼開發工具開發EJB好呀?
- 為什麼 Go 不支援 []T 轉換為 []interfaceGo
- 為什麼在Go語言中要慎用interface{}Go
- 什麼是前端開發?為什麼要學前端開發?前端
- Donald Knuth:我為什麼不用Email了?AI
- [譯]沒有 Interface Builder 的生活UI
- 為什麼Web開發人員在2020年不用最新的CSS功能WebCSS
- 您的團隊為什麼不用敏捷方法?敏捷
- 為什麼不用資料庫儲存圖片?資料庫
- Redis 為什麼用跳錶而不用平衡樹?Redis
- 淺談用力不用腦:你為什麼蹉跎這麼多年
- 為什麼不做開發做運維?Linux為什麼這麼廣泛?運維Linux
- EJB2.0中什麼時候用local interface,什麼時候用remote interface (轉)REM
- 前端為什麼需要模組化開發前端
- Android開發為什麼要用MVP?AndroidMVP
- 為什麼JavaScript需要模組化開發?JavaScript
- 為什麼JavaScript開發如此瘋狂JavaScript
- 為什麼尋找快速開發之道
- 為什麼我不再做.NET開發
- Java開發為什麼需要UML (轉)Java
- 為什麼開發者首選 iOS ?iOS
- 為什麼前端開發這麼不穩定?前端
- 為什麼我們要選用 Elasticsearch 而不用 SolrElasticsearchSolr
- 為什麼選擇用weblogic而不用tomcat?WebTomcat
- 我為什麼用Flutter開發-2年開發心得Flutter
- iOS BLE 開發小記[1] CoreBluetooth 是什麼iOS
- 什麼是 constructor signature in interfaceStruct
- iOS開發高階工程師,為什麼Bat面試官偏偏看上了我!iOS工程師BAT面試
- 開發Web應用為什麼要用TypeScript?WebTypeScript
- Flarum 的故事:我為什麼開發Flarum
- 松本行弘為什麼要開發Ruby
- 為什麼我要用 C 來開發遊戲?開發遊戲
- 為什麼軟體外包開發不再可行
- 我為什麼使用Linux做開發Linux
- Jquery會死嗎?我為什麼不用vue寫富文字!jQueryVue
- 為什麼引入SpringBoot依賴不用加版本號Spring Boot
- 為什麼那麼多公司在用快速開發平臺開發軟體?