iOS 徹底學會使用delegate

委托delegation的介紹:

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

委托與Cocoa 平臺

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

下面講一下在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對象,并指向已經定義的delegate的引用。那么我們需要為該id對象添加一些屬性,從而讓EnterViewController能夠訪問它。

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

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

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

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

savePressed方法與工具欄中的保存按鈕相聯系。當用戶完成了數字輸入以及點擊了保存,即觸發該方法。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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