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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼不用外來鍵
- [譯]沒有 Interface Builder 的生活UI
- 為什麼 Go 不支援 []T 轉換為 []interfaceGo
- 為什麼Web開發人員在2020年不用最新的CSS功能WebCSS
- 為什麼在Go語言中要慎用interface{}Go
- 什麼是前端開發?為什麼要學前端開發?前端
- 什麼是 constructor signature in interfaceStruct
- 為什麼引入SpringBoot依賴不用加版本號Spring Boot
- 為什麼不用資料庫儲存圖片?資料庫
- iOS BLE 開發小記[1] CoreBluetooth 是什麼iOS
- Android開發為什麼要用MVP?AndroidMVP
- 為什麼不做開發做運維?Linux為什麼這麼廣泛?運維Linux
- 為什麼我們要選用 Elasticsearch 而不用 SolrElasticsearchSolr
- iOS開發高階工程師,為什麼Bat面試官偏偏看上了我!iOS工程師BAT面試
- 我為什麼使用Linux做開發Linux
- 為什麼大多數IOC容器使用ApplicationContext,而不用BeanFactoryAPPContextBean
- Jquery會死嗎?我為什麼不用vue寫富文字!jQueryVue
- 為什麼現在大家都不用外來鍵了(二)?
- 為什麼前端開發這麼不穩定?前端
- 我為什麼用Flutter開發-2年開發心得Flutter
- 什麼是Java Marker Interface(標記介面)Java
- Golang語言中的interface是什麼(下)Golang
- Golang語言中的interface是什麼(上)Golang
- iOS應用加固為什麼也那麼重要?iOS
- 為什麼GOPROXY對Golang開發如此重要Golang
- 開發Web應用為什麼要用TypeScript?WebTypeScript
- 前端為什麼需要模組化開發前端
- 為什麼JavaScript需要模組化開發?JavaScript
- python為什麼不適合web開發PythonWeb
- 大廠為什麼不用MQ實現訂單到期關閉?MQ
- 為什麼我不用ViewPager或RecyclerView來做上下滑切換Viewpager
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- 為什麼那麼多公司在用快速開發平臺開發軟體?
- Proposer-Builder Separation (PBS) 的作用是什麼?UI
- 為什麼選擇 Intellij IDEA 作為日常開發工具IntelliJIdea
- 我為什麼選擇成為獨立開發者
- 為什麼推薦Kestrel作為網路開發框架框架
- 程式設計為什麼不用中文?未來用中文程式設計可能麼?程式設計
- 區塊鏈遊戲開發為什麼這麼火爆?區塊鏈遊戲開發