使用代理很好地避免控制器之間相互依賴(互相導入彼此的頭文件)這個問題。 用於上下級控制器之間的數據傳遞,誰成爲個人代理,我就能把數據傳給誰。markdown
定義一個協議;定義代理方法;設置代理屬性。 在類的.h中聲明:atom
// 引入類名
@class PDmyHeadView;
@protocol PDmyHeadViewDelegate <NSObject> //定義協議(命名:類名+Delegate)
-(void)clickHeadButton:(PDmyHeadView *)headView headButton:(UIButton *)headImgBtn; //代理方法 (參數:類對象+其餘)
@end
@interface PDmyHeadView : UIView
@property(nonatomic,weak) id<PDmyHeadViewDelegate> delegate; //聲明代理屬性
@end
複製代碼
PS:釋放後,delegate要爲nil,不然會是野指針,形成內存泄漏,這也是要用weak來聲明delegate的緣由。spa
在某個觸發方法中(如點擊),代理的擁有者判斷它的代理有無實現上面定義的代理方法,如有,則執行代理方法。代理
-(void)clickHeader:(UIButton *)headImgBtn{
if([self.delegate respondsToSelector:@selector(clickHeadButton:headButton:)]){
[self.delegate clickHeadButton:self headButton:headImgBtn]; //讓代理調用 代理方法
}
}
複製代碼
成爲代理,且實現代理方法指針
//建立
self.myHeadView = [[PDmyHeadView alloc] init];
self.myHeadView.delegate = self;
。。。
//實現headview的代理方法
-(void)clickHeadButton:(PDmyHeadView *)headView headButton:(UIButton *)headImgBtn{
NSLog("--%zd",headImgBtn.tag); //拿到數據
}
複製代碼
只能一對一通訊 -假如如今有類A,類B,類C -類C協議爲CDelegate,點擊類C的按鈕時,相應協議,輸出一句話 -類A和類B都實現了方法 -執行的操做是,從類A跳轉到類B,從類B跳轉至類C,點擊類C的按鈕,只有類B響應了。code