導語:目前學完了The iOS Apprentice的第一個系列胚吁,在此總結一下撑蚌。我采用的是第2版本(Objective-C語言版本)
這是The iOS Apprentice系列的第一個項目乒躺,手把手的教你如何開發(fā)一個滑動靶心猜數(shù)值的簡單小游戲近速。游戲完成的界面如下:
此教程對于初學者非常友好科展,沒有相關基礎知識也能照著學下來均牢,不過我覺得還是先學一下Objective-C語言的基本語法會更有效率些。
本書采用的學習方式是:先告訴你做什么才睹,怎么做徘跪,然后再結合理論知識講解為什么這么做。
開發(fā)APP第一步:做什么(What)
The to-do list待辦事項清單
開發(fā)一個App的第一步是明確需要做什么琅攘,而不是如何去實現(xiàn)垮庐。根據(jù)功能需求列出需要做的事項清單。比如本教程中的例子坞琴,需要開發(fā)一個通過滑動滑條哨查,使其數(shù)值越接近給定的目標值,所得的分數(shù)就越高的小游戲剧辐。
怎么列這個待辦事項呢寒亥?我目前是這樣做的:
- 根據(jù)需求描述,畫出游戲界面,列出需要使用的對象愿卒,比如本例中徒坡,滑條,按鈕腐宋,標簽等。
- 對應的每個對象檀轨,都需要實現(xiàn)什么樣的功能胸竞,比如本例中,滑動滑條能顯示出數(shù)值参萄,點擊按鈕顯示彈出窗口告訴玩家分數(shù)等卫枝。
- 按照玩法的流程,實現(xiàn)相應的動作和數(shù)值變化讹挎,這部分要理清各部分的邏輯關系校赤。
- 最后完善游戲界面吆玖,改善游戲體驗。
開發(fā)APP第二步:怎么做(How)
在完成了做什么之后马篮,就根據(jù)列出來的待辦事項清單逐個來實現(xiàn)沾乘。
- 首先要在主界面視圖里,添加視圖對象浑测,什么按鈕啊翅阵,標簽啊,滑條等迁央。在iOS里每個界面都有自己獨立的視圖控制器掷匠,在本例中目前還只有一個界面,所以只需要一個視圖控制器岖圈。
One of the design principles of iOS is that each screen in your app gets its own view controller.
- 然后在.h聲明文件里先聲明對象讹语,在.m實現(xiàn)文件里實現(xiàn)這個對象所需的實例變量和方法或動作。.h聲明文件告訴計算機是什么蜂科,視圖控制器里有什么募强,是什么樣的。.m實現(xiàn)文件則告訴計算機怎么做崇摄,視圖控制器里的對象是怎么運行的擎值。
the .h file tells the computer what the view controller does, while the .m file tells the computer how it does those things.
那么APP是如何運作的呢?
本教程中有這樣一個圖:
一個APP是有一些對象組成逐抑,這些對象通過相互發(fā)送消息來實現(xiàn)某些功能鸠儿。在iOS里,APP是由事件驅動(event-driven)的應用厕氨,也就是說對象們等待一些明確的事件發(fā)生來觸發(fā)它們發(fā)送消息进每,執(zhí)行相應的方法。比如按鈕這個對象命斧,只有你點擊它田晚,它才會執(zhí)行它的方法。其實一個APP大部分時間都是在等待国葬,等待觸發(fā)它的事件發(fā)生贤徒,當它執(zhí)行完后,繼續(xù)等待汇四。
說了這么多對象接奈,那對象到底是什么呢?
有句話說:萬物皆對象通孽。我們人類所接觸的具體存在的事物是對象序宦,比如人,電腦等背苦,所抽象出來的描述也是對象互捌,比如指令潘明,數(shù)據(jù)等。每個對象都包含數(shù)據(jù)和方法:
- 數(shù)據(jù)包含些什么東西(Data contains something)
- 方法做些什么東西(Functionality(methods) does something)
在上圖中秕噪,你(you)是一個對象钳降,你現(xiàn)在有個辦派對的能力(方法),你需要打掃房間巢价,準備好音樂,還需要冰淇凌固阁,但是你附近沒有賣冰淇凌的壤躲,不過你好朋友史蒂夫(Steve)他家附近有賣的,史蒂夫是一個對象备燃,他有買冰淇凌的能力(方法)碉克,打開錢包,來到商店并齐,付錢購買冰淇凌漏麦,然后來參加你的派對時就帶給你冰淇凌。圖中清楚的顯示了况褪,對象都包含哪些方法和數(shù)據(jù)撕贞。
對象里的數(shù)據(jù)可以是常量,也可以是變量测垛,常量顧名思義它的值是固定不變的捏膨,而變量則是可以變化的值,變量就像一個模型食侮,當你聲明一個變量時号涯,你就有了一個模型,根據(jù)不同的數(shù)據(jù)類型锯七,你也就有不同的模型链快,變量里的值可以被改變,就像在一個模型里眉尸,你可以有是不同顏色域蜗,你也可以隨時更換。但是不同類型的變量之間不能隨意更換噪猾,就像不同類型的模型一樣地消,你是的正方形放不進圓形的模型一樣,如下圖
在這里畏妖,變量就是上圖里的模型脉执,不同類型的變量就是不同的模型,下面的圖形就是這些模型的數(shù)據(jù)戒劫,只有符合相應類型的模型半夷,這些圖形才能放進去婆廊,不同的顏色就是不同數(shù)值。
When the thing that your app needs to remember changes, you take the old value out of the box and put in the new value. That’s the whole point behind variables: they can vary
The size of the storage container and the sort of values the variable can remember are determined by its datatype.
在iOS里巫橄,根據(jù)變量的生命周期淘邻,可以將變量分為局部變量和實例變量。局部變量就在在某個方法內部聲明湘换,只能作用于此方法宾舅,一旦方法執(zhí)行結束,這個局部變量就被銷毀彩倚。實例變量則可以在一個比如視圖控制器這個大類里被其類下的方法調用筹我。一般在實例變量名稱前加上下劃線"_",用來區(qū)別局部變量帆离。
下面說一下我在學這個教程時遇到的一個主要問題:在iOS8以后蔬蕊,蘋果不再支持UIAlertView類的使用,取而代之的是UIAlertController類哥谷,而本教程使用的就是UIAlertView類岸夯,所以就需要改寫alert view 的實現(xiàn)方法,只能使用UIAlertController類们妥。
本教程中關于alert view 的實現(xiàn)方法代碼是這樣的:
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
// 將alert view彈出窗口顯示在屏幕上
[alertView show];
//重新玩一次
[self startNewRound];
//更新標簽里的數(shù)據(jù)
[self updateLabels];
在本例中猜扮,我希望在我關閉彈出來的alert窗口后,游戲界面上的數(shù)值才發(fā)生改變监婶,而不是我點擊Hit me 按鈕后立即在界面上顯示改變后的目標值破镰,分數(shù)值,游戲次數(shù)等压储,本教程里是這樣分三步實現(xiàn)的:
1.在BullsEyeViewController.h聲明文件里在添加<UIAlertViewDelegate>
@interface BullsEyeViewController : UIViewController <UIAlertViewDelegate>
2.在showAlert動作實現(xiàn)代碼里把delegate:nil改成delegate:self鲜漩,同時移除[self startNewRound] 和 [self updateLabels]這兩個方法
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:title
message:message
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
// 將alert view彈出窗口顯示在屏幕上
[alertView show];
3.在.m實現(xiàn)文件里添加新方法- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex并將[self startNewRound] and [self updateLabels]兩個方法放入其中。
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
[self startNewRound];
[self updateLabels];
}
這里采用的是一種被稱為觀察者的模式(listener pattern or observer pattern)集惋,而這里的觀察者listener就是delegate孕似,通過這種監(jiān)聽的模式來實現(xiàn)這個功能的,當alert窗口要關閉時刮刑,向視圖控制器發(fā)送消息說我馬上要關閉了喉祭,然后在執(zhí)行[self startNewRound] and [self updateLabels]這兩個方法。
Delegates in three steps
Delegates are used everywhere in the iOS SDK, so it’s good to remember thatit always takes three steps to become someone’s delegate.
- You declare yourself capable of being a delegate. Here, you did that byincludingin your @interface line. This tells the compiler that the view controller can actually handle the notification messages that are sent to it.
- You let the object in question, in this case the UIAlertView, know that you wish to become its delegate. If you forget to tell the alert view that it has a delegate, then it will never send you any notifications.
- Implement the delegate methods. It makes no point to become a delegate if you’re not responding to the messages you’re being sent! Often, delegate methods are optional, so you don’t need to implement all of them. For example, UIAlertViewDelegate actually declares seven different methods but for this app you only care about alertView:didDismissWithButtonIndex:.
那么現(xiàn)在使用新的UIAlertController類如何實現(xiàn)上面這個功能的呢雷绢?
很簡單泛烙,只需要一步就可以實現(xiàn)這個功能。
UIAlertController* alertView = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) { [self startNewRound]; [self updateLabels];}];
[alertView addAction:defaultAction];
[self presentViewController:alertView animated:YES completion:nil];
在聲明UIAlertAction類里有一個Blocks對象翘紊,我把[self startNewRound] and [self updateLabels]這兩個方法放到它里面蔽氨,在alert view 關閉時才會會調用這兩個方法。
上述解決辦法主要解決這個舊版本帶來的問題,但我目前對delegate機制和UIAlertController類的理解比較膚淺鹉究,有待后面的學習中深入理解宇立,如上面理解有所錯誤,還望指正自赔,謝謝妈嘹!
APP開發(fā)第三步:完善功能和界面
在完成了主要功能后,可以增加能提供人性化貼心體驗的功能或交互設計绍妨。本教程中講述了如何使用自動布局润脸,修改背景圖案,圖標等他去,講的很詳細毙驯,照著做就行了,做的多才能靈活運用孤页!
結束語
至此尔苦,一個小游戲就開發(fā)出來了涩馆,可以玩耍下哦行施,是不是有點小成就感呢,呵呵魂那,反正我照著做下來后蛾号,裝在自己手機里時不時玩一下,持續(xù)燃燒著我的學習激情涯雅。
這個教程的學習方式是我所喜歡的鲜结,而且也是有效的,雖然是英文教程活逆,但并不難理解精刷,正好提高下英語水平嘛,不然怎么看懂蘋果的官方文檔蔗候。
雖然這個應用很簡單怒允,但這個過程也學了不少實用的開發(fā)知識,當然我這里還有很多內容沒涉及到锈遥,那就看教程吧纫事,畢竟我也只是簡單總結下我學了這個教程后的一點理解。如有不對的地方所灸,歡迎指正丽惶,謝謝
最后送上福利The.iOS.Apprentice.2nd.Edition
同時推薦下我正使用的PDF閱讀器:PDF Expert,記筆記什么的真的很方便爬立。
浪沙淘金钾唬,加油!