本隨筆系列主要介紹從一個Windows平臺從事C#開發到Mac平臺蘋果開發的一系列感想和體驗歷程,本系列文章是在起步階段逐步積累的,希望帶給大家更好,更真實的轉換歷程體驗。前面幾篇隨筆主要介紹C#和Objective-C之間的差異,本片開始介紹利用XCode來進行IOS的程序開發,對比和C#利用VS進行開發的差異,以便我們更快的融入到IOS開發的陣營。
在介紹利用XCode來開發項目前,我自己消化了幾本IOS開發的書籍,以及蘋果開發網站的一些自認為重要文章介紹,學習了一些視頻的內容,包括網易里面的斯坦福大學的一些視頻,并自己模擬了一些簡單的項目代碼開發,雖然不能說是已經掌握了相關的IOS開發(其實還差很遠),但是也對一些基礎的項目應用有了一個大概的了解,結合以前的Winfrom應用開發(很類似),也算有了一些小小的領悟吧。但介紹IOS開發,也是結合自己以前對C#開發的一些經驗和理解來介紹,希望不詳細,不確切的地方,大家多多指正。
1、根據項目模板創建項目
其實對開發而言,無論是對于使用C#開發的VS開發工具,還是基于Objective-C開發的XCode工具,都有基于模板生成對應的項目,這樣我們可以快速生成我們需要的項目框架,這里為了介紹方便,建立一個單視圖的應用程序,有點類似于我們創建一個Winform的標準應用程序,里面默認也是帶有一個Form窗體的,這個XCode的項目模板也是類似。
創建一個項目,我們需要指定項目的名稱、類前綴和一些相關的信息,這個和我們創建C#項目指定命名空間以及一些相關參數也有點類似,但不等同,C#里面,對于多個項目應用,我們可以通過命名空間進行區分,但是在IOS里面開發,我們就只能通過類名進行限定了,因此,必要的類名前綴是需要的,這個的類前綴,主要是用來創建項目的視圖控制器或者代理類的前綴標識。
創建的項目后的視圖如下所示,可以看出紅色方框就是前面一個地方的設置。
2、IOS項目和Winform項目開發的差別
創建的項目,默認有一個視圖控制器和一個視圖代理類,還有一個空白的界面,如下所示。這個和我們在VS里面開發Winform項目很類似,也是需要拖動控件進行界面設計的。
IOS里面也提供了很多相關的控件,作為界面設計的需要,當然除了拖動方式,在Objective C里面也可以通過代碼方式創建相關的控件對象,這個和C#創建控件一樣,沒什么差別。
但是,當我們把控件拖動放到設計面板里面后,發現雙擊不再是處理響應控件操作的代碼了,而是修改控件的標題,這個開發觀念和C#里面開發Winform應用不同,這個是因為IOS的開發是嚴格遵循MVC的設計模式,它的界面設計獨立的,界面視圖的控制器又有獨立的類進行處理,另外,它的一些處理,還可以放到一些代理類里面進行處理(如上圖截圖里面的應用程序委托類),這個其實有點類似于WPF的方式了,界面可以通過其他工具進行設計開發。
一般來說,我們在XCode中創建一個視圖的時候,同時也會創建一個空白的XIB后綴名的視圖界面,視圖控制器就是管理模型數據(和模型邏輯調用),然后以一定的方式呈現視圖內容,也就是說,控制器對模型和視圖都有全權的控制處理;而視圖如果要通知控制器,一般在IOS里面采用代理的方式或者Target-Action方式進行通信,它的關系可以通過斯坦福教授那個IOS開發介紹的圖形進行闡釋,如下所示。
我們如果是從事過C#的Winform開發的,或者WebForm的話,那么可能很不習慣,在IOS里面,界面設計和處理代碼是分開的,它利用XML來描述界面(XIB文件),另外,對于界面的后臺處理,通過視圖控制器進行,而每個視圖里面,可能還會放置一些子視圖,如WebView,TableView等這樣的視圖,如果需要這些具體的視圖操作,那么還需要在視圖控制器里面使用視圖代理接口,如子視圖的繪制和數據源的接口,選擇視圖某部分等操作,都是通過代理接口進行處理,而對于一些按鈕的操作,則是通過Target-Action這樣的模式進行響應。反觀C#里面的Winform開發,可能不會劃分那么復雜,多數是通過事件等方式對數據進行綁定或者按鈕事件的響應,要了解IOS的開發模式,可能這里需要特別注意調整的地方。
隨著認識的深入,你會慢慢了解這個模式對于界面的設計,代碼的維護分別的很清楚,維護很方便。
3、添加一些界面控件和處理
首先,我們和在VS里面開發WInform項目一樣,需要先繪制好界面,我們先把界面設計好向如下圖形所示,這個工作沒有什么特別之處,就是把它拖動到面板上,調整位置和布局即可。
為了好看,我在XCode的項目里面導入了一個圖片,然后指定了按鈕的背景圖片,如下所示。
運行界面,看到的效果和這個差不多,不過如果要在代碼里面對界面元素(如文本輸入、標簽、按鈕等)進行處理,目前還不可以,需要增加一個IBOutLet的對象到代碼里面,一般可以通過拖動的方式添加。
拖動的方式,就是按著Control拖動界面元素到代碼里面,會彈出一個輸入界面,輸入控件的名稱即可,這個變量稱之為插座(IBOutlet)變量,如下所示。
對于按鈕的事件處理,也可以通過這個方式進行添加,如下所示,
最后視圖實現類的代碼如下所示
#import "MyHelloAppViewController.h"
@interface MyHelloAppViewController ()
@property (weak, nonatomic) IBOutlet UITextField *txtName;
@property (weak, nonatomic) IBOutlet UITextField *txtAge;
- (IBAction)getResult:(id)sender;
@end
然后我們在后臺代碼里面,實現getResult的方法內容,把輸入的內容在彈出視圖里面進行展示,如下所示。
- (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里面的瀏覽器就是很好的例子,橫豎總適宜的。
我們上面方式創建的界面,雖然界面元素比較少,但是一旦橫著來看,那么它的效果就是固定寬度的了。
如果需要讓它們的元素能夠根據界面自動調整,就需要設置控件的約束,如下所示。
一旦添加了約束,我們選擇輸入框后,就會看到幾個方向上的一些線條提示,如下所示。
通過指定幾個不同方向的約束,就能夠很好的控制輸入框的大小了,讓它可以根據界面的調整而自動進行調整,運行模擬器,得到的界面效果如下所示,輸入框的寬度已經能夠自動伸縮了。