一個 iOS Universal 的 App 代碼結構要怎麼樣寫才算是一個好的代碼?

delegate,數據模型,View、Controller,ipad和iphone公用的控制 以及 不一樣邏輯的 各要怎麼寫?


幾個小建議:

===== Model要共用 =====

所有與數據相關的存儲、計算等都在Model里完成,這個與視圖沒有關係,可共用。

===== Controllers/Views的命名規範 =====

Controller在文件名上區分設備類型,並歸併到對應的目錄下,如:

Controllers
|- iPhone
|- CWDetailViewController_iPhone.h/m
|- CWMasterViewController_iPhone.h/m
......
|- iPad
|- CWDetailViewController_iPad.h/m
|- CWMasterViewController_iPad.h/m

Views的命名也類似。這樣在視覺上就能比較方便地找到某種設備對應的文件,又因為Xcode中的目錄並不是對應真實的文件目錄,所以在文件名後面加上了設備類型。

===== 為iPhone和iPad準備單獨的AppDelegate =====

這樣做的好處是可以避免在AppDelegate中,判斷設備類型,然後去載入對應的Controller,實現起來也很簡單,在main.m中判斷一下就好了。

int main(int argc, char *argv[])
{
@autoreleasepool {

Class appDelegateClass = IS_IPAD() ? [CWAppDelegate_IPad class] : [CWAppDelegate_IPhone class];

return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));
}
}

然後把兩個Delegate中相同的部分拎出來作為父類,這樣就清爽了。

這麼做的話,能有效地避免Controller中if/else泛濫的情況,相當於把iPhone和iPad兩個項目放到一塊,而不是通過if/else融合到一塊。

附上一個不錯的iOS Universal App Template kwylez/Universal-iOS-App-Template · GitHub


我認為這裡採用繼承是殺雞用牛刀,代碼量增大,維護其來也並不方便。

但是,大量的if/else,也並不便於維護。

我盡量把不同設備的區別放在xib中。本來嘛,xib肯定是不同的。那麼,controller中的不同,也確實源於xib的不同,是不是?比如,有的按鈕,有的控制面板,在ipad版中有,在iphone版中就沒有,或者尺寸、位置不同;但是對應的controller代碼中並不需要做出區分。

如果實在有需要在代碼上做區分的,可以抽出來放到一個單獨的文件裡面去處理,可能會更清晰一些。不過,並不一定要這麼做,多寫幾個if/else並不是什麼罪過。


剛寫完了一個系列,供參考:

App架構設計經驗談:介面的設計

App架構設計經驗談:技術選型

App架構設計經驗談:數據層的設計

App架構設計經驗談:業務層的設計

App架構設計經驗談:展示層的設計

另外,再強調一點,開發規範要做好


推薦閱讀:

什麼是 Cocoa,和 Objective-C 有什麼關係?開發 iOS 應用這兩者都要學習嗎?
有開發ios的公司用storyboard寫程序的嗎?
開發者如何減少移動廣告平台價格或分賬比例調整等波動對自身收入帶來的影響?開發者自己應該做好什麼?希望廣告平台做好什麼?
寫十年程序是什麼感覺?
為什麼 iPhone 6 Plus 要將 3x 渲染的 2208x1242 解析度縮小到 1080p 屏幕上?

TAG:iOS開發 | UniversalAppiOS |