iOS开发公开课总结
?????????????????????????????????????????????????????????????????? iOS開發(fā)公開課總結(jié)
前言
iphone開發(fā)相關(guān)的教程中最有名的,當(dāng)數(shù)斯坦福大學(xué)發(fā)布的”iphone開發(fā)公開課”了。此公開課在以前叫做《iphone開發(fā)教程》,今年由于平板電腦的流行,所以也加入了ipad開發(fā)相關(guān)的課程。在網(wǎng)易公開課上,有該教程的2010年錄象,并且前面15集帶中文字幕文件,非常適合初學(xué)者學(xué)習(xí)。
在這里順便說(shuō)一下,網(wǎng)易公開課上的28集其實(shí)并不需要全部看完。真正的課程只有前面12集。后面的課程都是請(qǐng)一些業(yè)界的名人講他們成功的app以及學(xué)生的作品展示,可看可不看。所以大家不要被28集這么多嚇到。
由于近一年來(lái)iOS5以及xcode4的發(fā)布,蘋果對(duì)原有的開發(fā)環(huán)境xcode以及開發(fā)語(yǔ)言O(shè)bjective-C都有改進(jìn),所以原有的教程中很多內(nèi)容不再適用了。例如新的xcode4將Interface Builder集成到xcode中,整個(gè)IDE布局和快捷鍵完全大變樣,又比如蘋果為Objective-c引用了ARC和Storyboard,這些都使得app的編程方式大為不同。
值得高興的是,斯坦福大學(xué)最近更新了該公開課的2011年秋季錄象,免費(fèi)下載地址是:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=480479762,不過(guò)現(xiàn)在該公開課還沒(méi)有翻譯,只能看英文原版了。新的課程相比以前要短了許多,一共只有9課。我大概快速看了一遍,總結(jié)一些心得給大家。
iOS的MVC模式
MVC模式算是客戶端類程序使用的設(shè)計(jì)模式的標(biāo)配了。iOS對(duì)于Model, View和Controller之間的相互調(diào)用有它自己的規(guī)范和約定,在公開課的第一課中,就介紹了應(yīng)該如何將MVC模式應(yīng)用在iOS開發(fā)中。主要的內(nèi)容就體現(xiàn)在如下這張圖中(圖片來(lái)自該公開課第一課的配套pdf的第37頁(yè)):
我下面詳細(xì)介紹一下這幅圖的意思。
-
首先圖中綠色的箭頭表示直接引用。直接引用直觀來(lái)說(shuō),就是說(shuō)需要包含引用類的申明頭文件和類的實(shí)例變量。可以看到,只有Controller中,有對(duì)Model和View的直接引用。其中對(duì)View的直接引用體現(xiàn)為IBOutlet。
-
然后我們看View是怎么向Controller通訊的。對(duì)于這個(gè),iOS中有3種常見的模式:
- 設(shè)置View對(duì)應(yīng)的Action Target。如設(shè)置UIButton的Touch up inside的Action Target。
- 設(shè)置View的delegate,如UIAlertViewDelegate, UIActionSheetDelegate等。
- 設(shè)置View的data source, 如UITableViewDataSource。通過(guò)這3種模式,View達(dá)到了既能向Controller通訊,又不需要知道具體的Controller是誰(shuí)是目的,這樣就和Controller解耦了。
-
最后我們看Model。Model在圖上有一個(gè)信號(hào)塔類似的圖形,旁邊寫著Notification & KVO。這表明Model主要是通過(guò)Notification和KVO來(lái)和Controller通訊的。關(guān)于Notification,我寫了一個(gè)模版代碼片段如下:(關(guān)于代碼片段的管理,推薦大家看我寫的另一篇文章:使用Github來(lái)管理xcode4中的代碼片段
| 1 2 3 4 5 6 7 | // 監(jiān)聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(<#methodName#>) name:kLoginNotification object:nil]; // 取消監(jiān)聽 [[NSNotificationCenter defaultCenter] removeObserver:self]; // 發(fā)送通知 NSDictionary * userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:200] forKey:@"code"]; [[NSNotificationCenter defaultCenter] postNotificationName:<#notification_name#> object:self userInfo:userInfo]; |
所以,對(duì)于初學(xué)者,要正確地使用MVC模式還是挺難的,回想我們以前做公司某產(chǎn)品iphone版的時(shí)候,就有一些Model層直接依賴了Controller層,比如Model層更新數(shù)據(jù)失敗了,直接調(diào)用Controller層顯示出一個(gè)失敗的提示界面。這樣層次劃分不清,造成我們做ipad版的時(shí)候很痛苦。最后我們做了代碼重構(gòu),把Model的相應(yīng)改變都用Notification來(lái)完成,使得在做ipad版開發(fā)時(shí)輕松了很多。
Convention About synthesize
“Convention over configuration”(約定高于配置)成就了Ruby On Rails,而iOS也有很多編程的約定。這些約定單獨(dú)看沒(méi)有什么好處,約定的最大好處就是,如果大家都遵守它,那么代碼風(fēng)格會(huì)趨于一致,你會(huì)很方便地讀懂或修改別人的代碼。
我們可以從第一課PPT的第50頁(yè)看到如下的代碼:
從圖中可以看到,該課程推薦大家在使用synthesize關(guān)鍵字時(shí),為property設(shè)置一個(gè)下劃線前綴。我也看過(guò)一些iphone的開源項(xiàng)目,比如facebook開源的 three20 ,它是遵守了這樣的約定的。
其它的約定還包括:
- 以new, copy, alloc開頭的方法,都應(yīng)當(dāng)由調(diào)用者來(lái)release,而其它方法,都返回一個(gè)autorelease對(duì)象。
- 通常iphone頂部的bar應(yīng)該用UINavigation控件,而底部的bar應(yīng)該用UIToolbar控件。
- 所有的UI操作都應(yīng)該在主線程(UI線程)進(jìn)行。這個(gè)似乎不是約定,但是好多同學(xué)不知道,也寫在這兒吧。
UIView
剛開始對(duì)界面之間的跳轉(zhuǎn)很不理解,后來(lái)發(fā)現(xiàn)其實(shí)很簡(jiǎn)單,就是一層一層疊起來(lái)的View。從View A上點(diǎn)擊一個(gè)按鈕跳轉(zhuǎn)到View B,其實(shí)就是把View B“蓋”在View A上面而已。而“蓋”的方式有好多種,通常的方法有2種:
一. 用UINavigationController把View B push進(jìn)來(lái)。
| 1 | [self.navigationController pushViewController:nextView animated:YES]; |
二. 用presentModalViewController方法把View B蓋在上面。
| 1 | [self presentModalViewController:nextView animated:YES]; |
除此之外,其實(shí)還有一種山寨方法,即把View A和View B都用addSubView加到AppDelegate類的self.window上。然后就可以調(diào)用 bringSubviewToFront 把 View B顯示出來(lái)了,如下所示:
| 1 2 3 4 5 | // AppDelegate.m類 [self.window addSubview:viewB]; [self.window addSubview:viewA]; // 在需要時(shí)調(diào)用 [self.window bringSubviewToFront:viewB]; |
上面說(shuō)的是界面之間的跳轉(zhuǎn)。對(duì)于一個(gè)界面內(nèi),其控件的布局其實(shí)也是一個(gè)一個(gè)疊起來(lái)的,之所以說(shuō)疊,是指如果2個(gè)控件如果有重疊部分,那么處于上面的那個(gè)控件會(huì)蓋住下面的。
Nib File
Nib文件實(shí)際上內(nèi)部格式是XML,而它本身并不編譯成任何二進(jìn)制代碼。所以你如果用iFile之類的軟件在iPhone上查看一些安裝好的軟件的目錄,可以看到很多的以nib結(jié)尾的文件,這些就是該軟件的界面文件。雖然這些XML經(jīng)過(guò)了一些壓縮轉(zhuǎn)換,但是我們還是可以看到一些信息,例如它使用了哪些系統(tǒng)控件等。
Nib文件剛開始給我的感覺(jué)很神秘,后來(lái)發(fā)現(xiàn)它其實(shí)就是用于可視化的編輯View類用的。其中的 File’s Owner一欄,用于表示這個(gè)View對(duì)應(yīng)的Controller類。通常情況下,Controller類會(huì)有一個(gè)名為view的變量,指向這個(gè)view的實(shí)例,我們也可以建立多個(gè)IBOutlet變量,指向這個(gè)view上的控件,以便做一些界面上的控制。
在Interface Builder上還有一個(gè)好處,是可以方便的將View的事件與Controller的IBAction綁定。只需要按住Ctrl鍵,從控件往File’s Owner一欄拖拽,即可看到可以綁定的方法列表。其實(shí)這些只是簡(jiǎn)化了我們的工作,如果完全拋開Interface Builder,我們一樣可以完成這些工作。我所知道業(yè)界的一些iOS開發(fā)部門,為了多人協(xié)作更加方便,更是強(qiáng)制不允許使用Interface Builder,一切界面工作都在代碼中完成。如果你用文本編輯器打開Nib文件看過(guò),就能理解這樣做是有道理的。因?yàn)槿绻?個(gè)同時(shí)編輯一個(gè)界面文件,那么沖突的可能性是100%,而且,從svn結(jié)出的沖突信息上看,你根本無(wú)法修正它。下面的代碼演示了如何不用Interface Builder來(lái)添加控件以及綁定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)]; |
總結(jié)
以上是生活随笔為你收集整理的iOS开发公开课总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 卖家新神器:淘宝宝贝复制专家。可以复制淘
- 下一篇: 蓝桥杯单片机555定时器频率测量 非常简