ios专题 - 斯坦福大学iOS开发公开课总结
轉自:http://blog.devtang.com/blog/2012/02/05/mvc-in-ios-develop/
前言
iphone開發相關的教程中最有名的,當數斯坦福大學發布的”iphone開發公開課”了。此公開課在以前叫做《iphone開發教程》,今年由于平板電腦的流行,所以也加入了ipad開發相關的課程。在網易公開課上,有該教程的2010年錄象,并且前面15集帶中文字幕文件,非常適合初學者學習。
在這里順便說一下,網易公開課上的28集其實并不需要全部看完。真正的課程只有前面12集。后面的課程都是請一些業界的名人講他們成功的app以及學生的作品展示,可看可不看。所以大家不要被28集這么多嚇到。
由于近一年來iOS5以及xcode4的發布,蘋果對原有的開發環境xcode以及開發語言Objective-C都有改進,所以原有的教程中很多 內容不再適用了。例如新的xcode4將Interface Builder集成到xcode中,整個IDE布局和快捷鍵完全大變樣,又比如蘋果為Objective-c引用了ARC和Storyboard,這些都 使得app的編程方式大為不同。
值得高興的是,斯坦福大學最近更新了該公開課的2011年秋季錄象,免費下載地址是:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=480479762,不過現在該公開課還沒有翻譯,只能看英文原版了。新的課程相比以前要短了許多,一共只有9課。我大概快速看了一遍,總結一些心得給大家。
iOS的MVC模式
MVC模式算是客戶端類程序使用的設計模式的標配了。iOS對于Model, View和Controller之間的相互調用有它自己的規范和約定,在公開課的第一課中,就介紹了應該如何將MVC模式應用在iOS開發中。主要的內容就體現在如下這張圖中(圖片來自該公開課第一課的配套pdf的第37頁):
我下面詳細介紹一下這幅圖的意思。
-
首先圖中綠色的箭頭表示直接引用。直接引用直觀來說,就是說需要包含引用類的申明頭文件和類的實例變量。可以看到,只有Controller中,有對Model和View的直接引用。其中對View的直接引用體現為IBOutlet。
-
然后我們看View是怎么向Controller通訊的。對于這個,iOS中有3種常見的模式:
- 設置View對應的Action Target。如設置UIButton的Touch up inside的Action Target。
- 設置View的delegate,如UIAlertViewDelegate, UIActionSheetDelegate等。
- 設置View的data source, 如UITableViewDataSource。 通過這3種模式,View達到了既能向Controller通訊,又不需要知道具體的Controller是誰是目的,這樣就和Controller解耦了。
-
最后我們看Model。Model在圖上有一個信號塔類似的圖形,旁邊寫著Notification & KVO。這表明Model主要是通過Notification和KVO來和Controller通訊的。關于Notification,我寫了一個模版代 碼片段如下:(關于代碼片段的管理,推薦大家看我寫的另一篇文章:使用Github來管理xcode4中的代碼片段
| 1 2 3 4 5 6 7 | // 監聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(<#methodName#>) name:kLoginNotification object:nil]; // 取消監聽 [[NSNotificationCenter defaultCenter] removeObserver:self]; // 發送通知 NSDictionary * userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:200] forKey:@"code"]; [[NSNotificationCenter defaultCenter] postNotificationName:<#notification_name#> object:self userInfo:userInfo]; |
所以,對于初學者,要正確地使用MVC模式還是挺難的,回想我們以前做公司某產品iphone版的時候,就有一些Model層直接依賴了 Controller層,比如Model層更新數據失敗了,直接調用Controller層顯示出一個失敗的提示界面。這樣層次劃分不清,造成我們做 ipad版的時候很痛苦。最后我們做了代碼重構,把Model的相應改變都用Notification來完成,使得在做ipad版開發時輕松了很多。
Convention About synthesize
“Convention over configuration”(約定高于配置)成就了Ruby On Rails,而iOS也有很多編程的約定。這些約定單獨看沒有什么好處,約定的最大好處就是,如果大家都遵守它,那么代碼風格會趨于一致,你會很方便地讀 懂或修改別人的代碼。
我們可以從第一課PPT的第50頁看到如下的代碼:
從圖中可以看到,該課程推薦大家在使用synthesize關鍵字時,為property設置一個下劃線前綴。我也看過一些iphone的開源項目,比如facebook開源的 three20 ,它是遵守了這樣的約定的。
其它的約定還包括:
- 以new, copy, alloc開頭的方法,都應當由調用者來release,而其它方法,都返回一個autorelease對象。
- 通常iphone頂部的bar應該用UINavigation控件,而底部的bar應該用UIToolbar控件。
- 所有的UI操作都應該在主線程(UI線程)進行。這個似乎不是約定,但是好多同學不知道,也寫在這兒吧。
UIView
剛開始對界面之間的跳轉很不理解,后來發現其實很簡單,就是一層一層疊起來的View。從View A上點擊一個按鈕跳轉到View B,其實就是把View B“蓋”在View A上面而已。 而“蓋”的方式有好多種,通常的方法有2種:
一. 用UINavigationController把View B push進來。
| 1 | [self.navigationController pushViewController:nextView animated:YES]; |
二. 用presentModalViewController方法把View B蓋在上面。
| 1 | [self presentModalViewController:nextView animated:YES]; |
除此之外,其實還有一種山寨方法,即把View A和View B都用addSubView加到AppDelegate類的self.window上。然后就可以調用 bringSubviewToFront 把 View B顯示出來了,如下所示:
| 1 2 3 4 5 | // AppDelegate.m類 [self.window addSubview:viewB]; [self.window addSubview:viewA]; // 在需要時調用 [self.window bringSubviewToFront:viewB]; |
上面說的是界面之間的跳轉。對于一個界面內,其控件的布局其實也是一個一個疊起來的,之所以說疊,是指如果2個控件如果有重疊部分,那么處于上面的那個控件會蓋住下面的。
Nib File
Nib文件實際上內部格式是XML,而它本身并不編譯成任何二進制代碼。所以你如果用iFile之類的軟件在iPhone上查看一些安裝好的軟件的 目錄,可以看到很多的以nib結尾的文件,這些就是該軟件的界面文件。雖然這些XML經過了一些壓縮轉換,但是我們還是可以看到一些信息,例如它使用了哪 些系統控件等。
Nib文件剛開始給我的感覺很神秘,后來發現它其實就是用于可視化的編輯View類用的。其中的 File’s Owner一欄,用于表示這個View對應的Controller類。通常情況下,Controller類會有一個名為view的變量,指向這個view 的實例,我們也可以建立多個IBOutlet變量,指向這個view上的控件,以便做一些界面上的控制。
在Interface Builder上還有一個好處,是可以方便的將View的事件與Controller的IBAction綁定。只需要按住Ctrl鍵,從控件往 File’s Owner一欄拖拽,即可看到可以綁定的方法列表。其實這些只是簡化了我們的工作,如果完全拋開Interface Builder,我們一樣可以完成這些工作。我所知道業界的一些iOS開發部門,為了多人協作更加方便,更是強制不允許使用Interface Builder,一切界面工作都在代碼中完成。如果你用文本編輯器打開Nib文件看過,就能理解這樣做是有道理的。因為如果2個同時編輯一個界面文件,那 么沖突的可能性是100%,而且,從svn結出的沖突信息上看,你根本無法修正它。下面的代碼演示了如何不用Interface Builder來添加控件以及綁定UI事件。
| 1 2 3 4 5 6 7 8 9 10 11 | // SampleViewController.m的viewDidLoad方法片段 // 添加Table View控件 UITableView * tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)]; [self.view addSubview:tableView]; tableView.delegate = self; [tableView release]; // 添加Button控件 self.button = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 100)] autorelease]; [self.view addSubview:self.button]; // 綁定事件 [self.button addTarget:self action:@selector(buttonPressed) forControlEvents:(UIControlEventTouchUpInside)]; |
總結
總體來講,學習iOS開發還是比較容易的。我大概花了一個月時間學習iPhone開發,就可以邊做邊學了。
蘋果的設計對于開發者來說是非常友好的,很多時候使用相應的控件就行了,都不用操心底層細節。不象Android開發,一會兒要考慮不同手機分辨率 不一樣了,一會兒又要考慮有些不是觸摸屏了,一會兒又發現某款手機的cpu內存太弱了跑不起來,需要優化程序。另外,Objective-C相對于C++ 語言來說,要簡單優雅得多,而且更加強大,所以做iOS的開發者很省心。
要說到不爽的地方,就是iOS開發相關的中文資料實在是太少了。要學習它,基本上需要查看蘋果的官方英文文檔以及WWDC大會視頻,還有去stackoverflow上問問題。這對于英文不太好的同學這可能是一個障礙。不過反過來,習慣之后,通過這個鍛煉了自己的英文水平,倒也是一大收獲。
轉載于:https://www.cnblogs.com/luoguoqiang1985/p/3464240.html
總結
以上是生活随笔為你收集整理的ios专题 - 斯坦福大学iOS开发公开课总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MOD04_3K数据处理
- 下一篇: pythonurllib新浪微博_pyt