iPhone開發(fā)應用處理基本交互
iPhone開發(fā)應用處理基本交互是本文要介紹的內(nèi)容,MVC:(Model View controller 模型,視圖,控制器)目標:實現(xiàn)三類盡可能截然不同的代碼,編寫的任何對象都應該很明顯的劃分為哪一類,并且其功能大部分不屬于或者完全不屬于另外兩個類。
MVC可以幫助確保實現(xiàn)最大的可重用性。
模型:保存應用程序的數(shù)據(jù)的類。設(shè)計一些OBjective-C類來保存應用程序的數(shù)據(jù)。
視圖:窗口、控件和其他用戶可以看到并能與之交互的元素的組成部分。
控制器:將模型和視圖綁定在一起,確定如何處理用戶輸入的應用程序邏輯。由開發(fā)人員創(chuàng)建的類和特定于應用程序的類組成。
Classes文件夾中的四個文件:(兩對.m和.h文件)
IP_03buttonfunViewController將負責管理該視圖。
- #import <UIKit/UIKit.h>
- @interface IP_03buttonfunViewController : UIViewController {
- }
- @end
這是UIViewController的子類。(UIViewController局勢一個通用的控制器,他是UIKit的一部分)
IP_03buttonfunAppDelegate實現(xiàn)了應用程序委托。委托,負責為另外一個對象處理特定事情的類。通過應用程序委托,我們可以在預先定義的時間為UIApplication處理事情。
輸出口(OutLet):
輸出口Outlet,是一個特殊的實例變量,控制器類可以使用他來引用nib中的對象。可以把輸出口看成是指向nib中的對象的指針。例如:假設(shè)在IB中創(chuàng)建一個文本標簽,需要在代碼中對該文本標簽進行修改操作,這時就需要聲明一個輸入口,并將其指向該標簽,這樣就可以通過改輸入口來修改該標簽了。
輸出口是使用關(guān)鍵字IBOutlet聲明的實例變量。
IBOutlet關(guān)鍵字的定義如下:
- #ifndef IBOutlet
- #define IBoutlet
- #endif
對編譯器而言,IBoutlet并未執(zhí)行任何操作,他僅僅是告訴IB,此實例變量將被連接到nib中的對象。
操作(Action):
操作是控制器類中的方法,通過IBAction來聲明。該關(guān)鍵字告訴IB,此方法是一個操作,并且可以被某個控件觸發(fā)。
操作的聲明如下:
- -(IBAction)doSomething:(id)sender;
沒有任何返回值。操作方法接受一個參數(shù),該參數(shù)為id類型。名稱被制定為sender,觸發(fā)操作的控件將使用sender參數(shù)引用其自身。
@property聲明:
在以前的操作中遇到這個問題一直沒有答案,今天在看這一章的時候,上面有詳細的講解,好好學學。
@property所聲明的是一些屬性。這也是Objective-C2.0的一個新特性。就想.NET中的set和get一樣。在Objective-C中添加屬性,通常會有設(shè)置屬性和檢索屬性,這中方法被成為訪問方法和修改方法。例如下面的形式:
- -(id)foo //訪問方法
- {
- return foo;
- }
- -(id)setFoo:(id)aFoo
- {
- if(aFoo!=foo)
- {
- [aFoo retain];
- [foo release];
- foo = aFoo;
- }
- }
使用@property就告別了這種枯燥乏味的訪問方法和修改方法。我們可以使用@property和@synthesize相結(jié)合,可以通知編譯器在編譯的時候創(chuàng)建獲取方法和設(shè)置方法。一下面的例子為例:
- @property (retain,nonatomic) UILabel *statusText;
其中的參數(shù)retain,通知編譯器向分配給此屬性的對象發(fā)送一個保留信息,這樣不會從內(nèi)存中清楚。這是必不可少的。因為默認行為assign需要與垃圾收集一起使用。垃圾收集在IPhone當前尚未使用。
第二個可選屬性nonatomic將更改訪問方法和修改方法的生成方式。
Objective-C屬性還具有另外一個特性,呢就是點表示法。
- myVar = [someObject foo];或者myVar = someObject.foo;都是可以的
- someObject.foo = myVar;等同于[someObject setFoo:myvar]
得到Button的Title:
- NSString *title = [sender titleForState:UIControlStateNormal];
在請求按鈕的標題時我們要提供控件的狀態(tài),4種可能的狀態(tài)為:
a:正常(normal)表示控件處于活動狀態(tài),但當前并未使用
b:突出顯示(highlighted)表示控件正被按住或被使用
c:禁用(disabled)表示按鈕未啟用且無法使用
d:以選中(selected)僅特定控件具有該狀態(tài),表示控件當前已被選中
- NSString *newText = [NSString stringWithFormat:@"%@ button pressed.",title];
等同于
- NSString *newText = [[NSString allac] initWithFormat:@"%@ button pressed.", title];
實現(xiàn)的功能相同但是第一種方法不建議用。第一種方法被成為簡便方法或工廠方法,它將返回自動釋放的對象。在對象使用完成之后還會保留一段時間,浪費了內(nèi)存,不建議使用。
[statusText release];既然我們沒有實例化該對象,為什么還有release呢?
因為我們實現(xiàn)了各輸出口的屬性,并且為該屬性指定了retain參數(shù),因此我們必須要釋放他。
創(chuàng)建例子:
打開Xcode。File->New Project->Iphone Application->View-Based Application->IP_03buttonfun
修改IP_03buttonfunViewController.h成:
- #import <UIKit/UIKit.h>
- @interface IP_03buttonfunViewController : UIViewController {
- IBOutlet UILabel *statusText;
- }
- @property (retain,nonatomic) UILabel *statusText;
- -(IBAction)buttonPressed:(id)sender;
- @end
修改IP_03buttonfunViewController.m成:
- #import "IP_03buttonfunViewController.h"
- @implementation IP_03buttonfunViewController
- @synthesize statusText;
- -(IBAction)buttonPressed:(id)sender
- {
- NSString *title=[sender titleForState:UIControlStateNormal];
- NSString *newText=[[NSString alloc]initWithFormat:@"%@ button pressed!",title];
- [statusText setText:newText];
- [newText release];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- }
- - (void)dealloc {
- [statusText release];
- [super dealloc];
- }
- @end
代碼創(chuàng)建完畢,現(xiàn)在可以關(guān)聯(lián)IB了。
拖兩個Button一個Label到View中。修改Button為Lift和Right,修改Label為空并且調(diào)整適當?shù)拇笮 ?/p>
創(chuàng)建控件完畢。
選中Button Lift,然后Apple+2,看到Touch Up inside后面的一個小圈圈,用鼠拖到File's Ouner上面。同理Button Right一樣的操作。
選中Label,Apple+2會看到statusText,和上面一樣拖到File's Ouner上。
程序完成,Build and go運行結(jié)果如下。
小結(jié):iPhone開發(fā)應用處理基本交互的內(nèi)容介紹完了,希望本文對你有所幫助!