《瘋狂iOS講義(上)》第九章學習心得

從四天前我正式進入iOS的SDK編程開發學習,可以說剛上來就被各種各樣的困難給狠狠地打擊了一下。

首先,說一下我從書中學到的知識吧。
iOS開發所用的編譯環境是Xcode6,新建了一個test項目。
Xcode6和之前Xcode版本的項目文件分類略有不同,取消了Frameworks文件夾。之前版本的Frameworks文件夾中包含有四個框架,分別是:UIKit.framework、Foundation.framework、CoreGraphic.framework和XCTest.framework。
iOS開發一個顯著的特點就是將界面設計的工作放在了Main.storyboard中。
左側的列表叫做dock區,裏面的根目錄是一個Scene,裏面包含所有的viewcontroller,而右側則是controller所操控的界面。
當前的這個界面中含有兩個UIView控件,分別是Label和Button。當你點選其中任何一個控件時,再點擊右上角的屬性檢查器面板,可以在裏面對控件的各種屬性進行修改編輯。 
Xcode在屬性面板檢查器中各種屬性的佈局是分模塊的,分模塊的依據就是這個控件類的繼承樹,子類的屬性在上面,父類的屬性靠下,就比如這個Label控件,它繼承自View根控件,因此Label在上面,而View在下面。如果點擊Button按鈕,由於它繼承自Control根控件,因此排列也是自上而下的由子類到父類的順序。
控件的各種屬性需要程序員自己長期的實踐來熟悉它們,文中不再贅述。
大體瀏覽完Xcode6的整體界面後,我們來說說iOS開發所嚴格遵守的MVC設計模式。
開始前,我們先了解一下iOS程序的運行機制。
iOS也是從main函數開始執行的,只不過main函數當中只有一句最重要的代碼:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

UIApplicationMain函數首先要創建一個UIApplication的實例,而且是單例模式創建的,因爲這個對象就代表着整個iOS程序本身。第三個參數爲nil,則代表着這個實例的名稱爲UIApplication,不然的話則要自己定義實例的名稱,一般也不推薦。第四個參數則是創建應用程序的委託代理。這個函數是一個“死循環”,應用程序的各種生命週期事件會循環往復的在執行,直到程序被終止,這個函數纔會退出。
注:UIApplicationMain函數還會做一件事,那就是加載主界面設計文件,並且把對應的用戶界面顯示在窗口中。
而委託類則是處理生命週期事件的主要負責類,應用程序委託對象是整個iOS應用第一個被加載、執行的對象,它滿足兩個規則:繼承自UIResponder基類和實現UIApplicationDelegate協議。
注:UIResponder是iOS應用提供的一個基類,所有需要向用戶提供響應的對象都需要繼承UIResponder基類。
這個UIApplicationDelegate協議中提供了許多重要的成員方法。這些方法負責處理iOS應用的各種生命週期事件。程序會默認的在.m文件中提供默認的一些方法,它們分別是:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
-(void)applicationDidBecomeActive:(UIApplication *)application
-(void)applicationWillTerminate:(UIApplication *)application
它們的執行順序一般是按照:如果是進入後臺則先失去焦點,如果要進入前臺則先進入前臺再得到焦點。
以上就是iOS應用程序的運行機制。
接下來我們就說一下MVC。
iOS的Model一般是由一些普通的OC類來充當的,這些類可用於保存少量的應用程序狀態。如果狀態數據較多,則可以考慮使用Core Data來構建數據模型。
iOS的View主要使用Interface Builder或storyboard來創建,有時也會在代碼中進行創建、修改甚至擴展已有的組件。
而iOS的controller則是由開發者開發的OC類來充當,大部分的controller會繼承UIKit框架中的UIViewController基類來獲得大量的功能。通過這些功能,controller就可以控制和它們相關聯的視圖組件。這些功能方法有:
viewDidLoad
didReceiveMemoryWarning
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewWillLayoutSubview
viewDidLayoutSubview
iOS的MVC大體上就是這樣的了。
如果想讓view中的控件能夠響應用戶的操作,那麼首先就要讓程序去獲取這些控件,iOS提供了兩種方式去獲取控件:
1. 通過IBOutlet來獲取控件
2. 通過爲控件指定Tag屬性來獲取控件
具體的操作很簡單,就不贅述了。
獲取完控件之後,還要設置事件的處理機制,意思就是說你獲取了控件之後,針對它發生的一些事件需要程序員去編寫響應函數。事件一般是枚舉值,因爲控件總共也就那麼一些可能的事件發生,例如點擊、多點觸控、滑動等等。但響應函數需要程序員去編寫。iOS常見的事件處理機制有三種方式:
1. 通過IBAction綁定控件的特定事件到控制器的指定方法上
2. 在程序中爲UI控件的特定事件綁定事件監聽器
3. 對於UI控件的某些生命週期事件直接委託給對應的委託對象去處理
上述三種方法的操作也不再贅述。不過對於第二個方法,要記住一個事件綁定方法:-(void)addTarget:(id) action:(SEL) forControlEvents:(UIControlEvents)。
至此,基本的iOS程序開發流程有了一個大致的瞭解,可當我編寫完代碼,準備運行的時候,大麻煩就來了。
首先,點擊運行的時候,出現下面的錯誤:

"Xcode cannot run using the selected device."
我一看,原來我選擇的真機測試模式,我點擊 iOS Device後,彈出一個菜單,可裏面只有這一個選項!我的模擬器都不見了!
於是我去網上尋找各種答案,第一天得到的答案是要調整項目的Deployment Target參數。我將其修改成iOS7.1、7.0、6.1、6.0甚至到4.3,發現還是沒有模擬器,原因不在這裏。
第二天我從網上得到的答案是在preference的download標簽下去下載模擬器,我突然意識到,我更新了Xcode6之後確實沒有下載模擬器,於是我覺得我終於找到了答案,興沖沖的去下載了。
下載Components完成之後,我沮喪地發現還是沒有模擬器,這個時候我真的感覺好無力啊……
第三天我去網上找,各種相同的答案,各種同病相憐的同胞,有的說卸載Xcode重裝,我覺得值得一試,於是我就真的把Xcode卸載了,卸載它需要用到終端,還要把它的殘留都得清理乾淨,對於我這種剛剛接觸Mac OS X剛有一個月的人來說,這種東西真的有點超出我個人的能力範圍。不過,我還是把它卸載了,最後又在Apple Store中安裝上了Xcode6。然後又下載完模擬器之後,發現——還是不行……
第四天偶然發現有人說去Xcode的windows裏面去添加模擬器,我用快捷鍵command+shift+2打開了界面。
在左下方有一個“+”,點擊它。出現一個對話框,在這裏可以添加模擬器。
看到這一幕,我真的想哭了,終於讓我找到你了,終於知道怎麼創建模擬器了,哎,操蛋的人生終於迎來春天了……可是,當我選擇完畢,點擊Create之後,噩耗再次襲來!
提示我說:“unable to determine simdevicesetsetpath=…...”等號之後的省略號是一段路徑,每個人的電腦不同,路徑也不相同。我一個Mac小白,看到這真跪了。心想這臺破Mac是罷工的節奏啊!還能不能愉快地編碼了?
過了很久,我終於想出了一個辦法,要不就找到這個路徑看看吧,按照提示的路徑我一級一級地往下找,發現路徑不存在,我在想,是不是Xcode6需要在這個路徑下去創建模擬器,而當它想創建文件夾的時候,系統的安全設置又阻止了它這麼做呢?我抱着這個想法去按照它提示的路徑一級級地創建了出來,第一次創建的時候還提示輸入管理員密碼。我有種預感,這一定就是癥結所在了!
創建完路徑之後,我再次cmd+shift+2去創建simulator——終於,成功了。

如果有什麼疑問請加Q:1223536070。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章