iOS 徹底學(xué)會使用delegate

委托delegation的介紹:

委托delegation是一種簡單但是功能強大的設(shè)計模式,它的功能是程序中一個對象代表另一個對象,或者一個對象與另外一個對象協(xié)同工作。委托 對象保留了另外一個對象的引用,即就是委托,以及在合適的時候發(fā)送消息給委托。消息通知事件的委托方法,委托對象將要處理或已經(jīng)處理。委托可能通過更新本 身或者本應(yīng)用的其他對象的狀態(tài)或者外觀來對消息進(jìn)行響應(yīng),在某些情況下委托也可能返回值,從而影響即將發(fā)生事件的處理方式。委托模式的主要價值是讓你通過 一個中心對象,簡單的自定義某些對象的行為。

委托與Cocoa 平臺

委托對象是典型的一種平臺對象,而且委托是典型的一種自定義的控制器對象。在一個通過管理的內(nèi)存環(huán)境中,委托對象保留了它的委托的弱引用,而在垃圾回收的環(huán)境中,接收者即委托對象保留它的委托的強引用。委托delegation的例子廣泛存在于Foundation, UIKit, AppKit, 以及其他的r Cocoa 和 Cocoa Touch平臺上。
以AppKit平臺上NSWindow類的實例來作為委托對象為例。NSWindow類聲明了協(xié)議,協(xié)議包含了windowShouldClose:
方法。當(dāng)用戶點擊了窗體的關(guān)閉按鈕,那么窗體對象就發(fā)送windowShouldClose:
給它的委托,并請求委托來關(guān)閉窗體。委托將返回一個布爾值,用來控制窗體對象的行為。

下面講一下在ios 中如何使用delegate

首先,聲明delegate。

例如:
//返回用戶輸入的委托

@protocol EnterDelegate  <NSObject>
@required//這個可以是required,也可以是optional
-(void)Entered:(NSInteger)amount;
@end

在委托的聲明中,我們只定義了一個方法,它將給rootViewController返回從用戶輸入獲得的一個NSInteger對象。

其次,在rootViewController中定義一個委托對象

如下代碼:

@interface EnterViewController : UIViewController {        
   IBOutlet UITextField *InputTextField;       
   id < EnterDelegate > delegate;    
 }
-(IBAction)cancel-(IBAction)save;@property(nonatomic,assign)id delegate;
@end

上面的代碼中“id < EnterDelegate > delegate”聲明了id對象,并指向已經(jīng)定義的delegate的引用。那么我們需要為該id對象添加一些屬性,從而讓EnterViewController能夠訪問它。

接下來,實現(xiàn)委托方法。因為delegate Entered:方法是必須的,所以需要實現(xiàn)該方法。

-(void)Entered:(NSInteger)amount{  
    InputLabel.text = [NSString stringWithFormat:@"%i" , amount];
}

最后,完成委托對象給委托發(fā)送消息。即在EnterViewController的實現(xiàn)文件.m中完成上面定義的一些方法。

-(IBAction)savePressed{   
 //確定委托是否存在Entered方法   
 if([delegate respondsToSelector:@selector(Entered:)])   
 {       
   //發(fā)送委托方法,方法的參數(shù)為用戶的輸入    
    [delegate Entered:[InputTextField.text intValue]]; 
  }      
  [self dismissModalViewControllerAnimated:YES];
}

savePressed方法與工具欄中的保存按鈕相聯(lián)系。當(dāng)用戶完成了數(shù)字輸入以及點擊了保存,即觸發(fā)該方法。

上面的過程就是如何使用委托的過程,雖然功能是很簡單的。
從委托方法的實現(xiàn)來看,委托方法的實現(xiàn)是在另外一個類中完成,即委托類的內(nèi)部暴露了,與我們一般堅持的隱藏實現(xiàn)原則相違背。
從委托類的定義可以看出,委托與協(xié)議有一定的相似性。都采用protocol關(guān)鍵字來聲明
,并且其中的方法都有optional和required,都需要對required方法和調(diào)用的optional方法進(jìn)行實現(xiàn)。而不同的是在委托對象所在的類中需要定義一個delegate對象,并且為id類型。
但是delegate與protocol沒有關(guān)系。Delegate本身應(yīng)該稱為一種設(shè)計模式,是把一個類自己需要做的一部分事情,讓另一個類(也可以就是自己本身)來完成,而實際做事的類為delegate。而protocol是一種語法,它的主要目標(biāo)是提供接口給遵守協(xié)議的類使用,而這種方式提供了一個很方便的、實現(xiàn)delegate模式的機會

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ) 1. 為什么說Objective-C是一門動態(tài)的語言? 2. 講一下MVC和MVVM,MVP? 3. 為...
    波妞和醬豆子閱讀 3,513評論 0 46
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1...
    如風(fēng)家的秘密閱讀 954評論 0 4
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,582評論 30 472
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,469評論 0 3
  • 重點掌握 3 類對象和方法 對象就是一個物體 類的獨特存在就是一個實例,對實例進(jìn)行操作叫做方法。方法可以應(yīng)用于類或...
    Coder大雄閱讀 1,365評論 0 2

友情鏈接更多精彩內(nèi)容