本隨筆系列主要介紹從一個Windows平臺從事C#開發(fā)到Mac平臺蘋果開發(fā)的一系列感想和體驗歷程药有,本系列文章是在起步階段逐步積累的毅戈,希望帶給大家更好苹丸,更真實的轉(zhuǎn)換歷程體驗。前面幾篇隨筆主要介紹C#和Objective-C之間的差異苇经,本片開始介紹利用XCode來進行IOS的程序開發(fā)赘理,對比和C#利用VS進行開發(fā)的差異,以便我們更快的融入到IOS開發(fā)的陣營扇单。
在介紹利用XCode來開發(fā)項目前商模,我自己消化了幾本IOS開發(fā)的書籍,以及蘋果開發(fā)網(wǎng)站的一些自認為重要文章介紹蜘澜,學習了一些視頻的內(nèi)容施流,包括網(wǎng)易里面的斯坦福大學的一些視頻,并自己模擬了一些簡單的項目代碼開發(fā)兼都,雖然不能說是已經(jīng)掌握了相關的IOS開發(fā)(其實還差很遠)嫂沉,但是也對一些基礎的項目應用有了一個大概的了解,結(jié)合以前的Winfrom應用開發(fā)(很類似)扮碧,也算有了一些小小的領悟吧趟章。但介紹IOS開發(fā),也是結(jié)合自己以前對C#開發(fā)的一些經(jīng)驗和理解來介紹慎王,希望不詳細蚓土,不確切的地方,大家多多指正赖淤。
1蜀漆、根據(jù)項目模板創(chuàng)建項目
其實對開發(fā)而言,無論是對于使用C#開發(fā)的VS開發(fā)工具咱旱,還是基于Objective-C開發(fā)的XCode工具确丢,都有基于模板生成對應的項目,這樣我們可以快速生成我們需要的項目框架吐限,這里為了介紹方便鲜侥,建立一個單視圖的應用程序,有點類似于我們創(chuàng)建一個Winform的標準應用程序诸典,里面默認也是帶有一個Form窗體的描函,這個XCode的項目模板也是類似。
創(chuàng)建一個項目狐粱,我們需要指定項目的名稱舀寓、類前綴和一些相關的信息,這個和我們創(chuàng)建C#項目指定命名空間以及一些相關參數(shù)也有點類似肌蜻,但不等同互墓,C#里面,對于多個項目應用宋欺,我們可以通過命名空間進行區(qū)分轰豆,但是在IOS里面開發(fā)胰伍,我們就只能通過類名進行限定了,因此酸休,必要的類名前綴是需要的骂租,這個的類前綴,主要是用來創(chuàng)建項目的視圖控制器或者代理類的前綴標識斑司。
創(chuàng)建的項目后的視圖如下所示渗饮,可以看出紅色方框就是前面一個地方的設置。
2宿刮、IOS項目和Winform項目開發(fā)的差別
創(chuàng)建的項目互站,默認有一個視圖控制器和一個視圖代理類,還有一個空白的界面僵缺,如下所示胡桃。這個和我們在VS里面開發(fā)Winform項目很類似,也是需要拖動控件進行界面設計的磕潮。
IOS里面也提供了很多相關的控件翠胰,作為界面設計的需要,當然除了拖動方式自脯,在Objective C里面也可以通過代碼方式創(chuàng)建相關的控件對象之景,這個和C#創(chuàng)建控件一樣,沒什么差別膏潮。
但是锻狗,當我們把控件拖動放到設計面板里面后,發(fā)現(xiàn)雙擊不再是處理響應控件操作的代碼了焕参,而是修改控件的標題轻纪,這個開發(fā)觀念和C#里面開發(fā)Winform應用不同,這個是因為IOS的開發(fā)是嚴格遵循MVC的設計模式叠纷,它的界面設計獨立的桐磁,界面視圖的控制器又有獨立的類進行處理,另外讲岁,它的一些處理,還可以放到一些代理類里面進行處理(如上圖截圖里面的應用程序委托類)衬以,這個其實有點類似于WPF的方式了缓艳,界面可以通過其他工具進行設計開發(fā)。
一般來說看峻,我們在XCode中創(chuàng)建一個視圖的時候阶淘,同時也會創(chuàng)建一個空白的XIB后綴名的視圖界面,視圖控制器就是管理模型數(shù)據(jù)(和模型邏輯調(diào)用)互妓,然后以一定的方式呈現(xiàn)視圖內(nèi)容溪窒,也就是說坤塞,控制器對模型和視圖都有全權的控制處理;而視圖如果要通知控制器澈蚌,一般在IOS里面采用代理的方式或者Target-Action方式進行通信摹芙,它的關系可以通過斯坦福教授那個IOS開發(fā)介紹的圖形進行闡釋,如下所示宛瞄。
我們?nèi)绻菑氖逻^C#的Winform開發(fā)的浮禾,或者WebForm的話,那么可能很不習慣份汗,在IOS里面盈电,界面設計和處理代碼是分開的,它利用XML來描述界面(XIB文件)杯活,另外匆帚,對于界面的后臺處理,通過視圖控制器進行旁钧,而每個視圖里面吸重,可能還會放置一些子視圖,如WebView均践,TableView等這樣的視圖晤锹,如果需要這些具體的視圖操作,那么還需要在視圖控制器里面使用視圖代理接口彤委,如子視圖的繪制和數(shù)據(jù)源的接口鞭铆,選擇視圖某部分等操作,都是通過代理接口進行處理焦影,而對于一些按鈕的操作车遂,則是通過Target-Action這樣的模式進行響應。反觀C#里面的Winform開發(fā)斯辰,可能不會劃分那么復雜舶担,多數(shù)是通過事件等方式對數(shù)據(jù)進行綁定或者按鈕事件的響應,要了解IOS的開發(fā)模式彬呻,可能這里需要特別注意調(diào)整的地方衣陶。
隨著認識的深入,你會慢慢了解這個模式對于界面的設計闸氮,代碼的維護分別的很清楚剪况,維護很方便。
3蒲跨、添加一些界面控件和處理
首先译断,我們和在VS里面開發(fā)WInform項目一樣,需要先繪制好界面或悲,我們先把界面設計好向如下圖形所示孙咪,這個工作沒有什么特別之處堪唐,就是把它拖動到面板上,調(diào)整位置和布局即可翎蹈。
為了好看淮菠,我在XCode的項目里面導入了一個圖片,然后指定了按鈕的背景圖片杨蛋,如下所示兜材。
運行界面,看到的效果和這個差不多逞力,不過如果要在代碼里面對界面元素(如文本輸入曙寡、標簽、按鈕等)進行處理寇荧,目前還不可以举庶,需要增加一個IBOutLet的對象到代碼里面,一般可以通過拖動的方式添加揩抡。
拖動的方式户侥,就是按著Control拖動界面元素到代碼里面,會彈出一個輸入界面峦嗤,輸入控件的名稱即可蕊唐,這個變量稱之為插座(IBOutlet)變量,如下所示。
對于按鈕的事件處理烁设,也可以通過這個方式進行添加替梨,如下所示,
最后視圖實現(xiàn)類的代碼如下所示
#import "MyHelloAppViewController.h"
@interface MyHelloAppViewController ()
@property (weak, nonatomic) IBOutlet UITextField *txtName;
@property (weak, nonatomic) IBOutlet UITextField *txtAge;
- (IBAction)getResult:(id)sender;
@end
然后我們在后臺代碼里面装黑,實現(xiàn)getResult的方法內(nèi)容副瀑,把輸入的內(nèi)容在彈出視圖里面進行展示,如下所示恋谭。
- (IBAction)getResult:(id)sender
{
NSLog(@"姓名:%@ 年齡:%@",self.txtName.text, self.txtAge.text);
UIAlertView *message = [[UIAlertView alloc] initWithTitle:self.txtName.text
message:self.txtAge.text
delegate:self cancelButtonTitle:@"取消"
otherButtonTitles:@"保存", nil];
message.alertViewStyle = UIAlertViewStyleDefault;
[message show];
}
運行界面后糠睡,得到的效果如下所示。
4疚颊、界面的橫向布局
我們知道狈孔,一般的IOS應用,可以豎著使用材义,也可以橫著使用除抛,如果界面支持,那么橫著的話母截,也應該看起來很美觀才可以,例如IOS里面的瀏覽器就是很好的例子橄教,橫豎總適宜的清寇。
我們上面方式創(chuàng)建的界面喘漏,雖然界面元素比較少,但是一旦橫著來看华烟,那么它的效果就是固定寬度的了翩迈。
如果需要讓它們的元素能夠根據(jù)界面自動調(diào)整,就需要設置控件的約束盔夜,如下所示负饲。
一旦添加了約束,我們選擇輸入框后喂链,就會看到幾個方向上的一些線條提示返十,如下所示。
通過指定幾個不同方向的約束椭微,就能夠很好的控制輸入框的大小了洞坑,讓它可以根據(jù)界面的調(diào)整而自動進行調(diào)整,運行模擬器蝇率,得到的界面效果如下所示迟杂,輸入框的寬度已經(jīng)能夠自動伸縮了。