iOS代理的基本使用

應用一:類之間數據的傳遞

  • 下級->上級數據傳遞

使用代理很好地避免控制器之間相互依賴(互相導入彼此的頭文件)這個問題。 用於上下級控制器之間的數據傳遞,誰成爲個人代理,我就能把數據傳給誰。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

QQ.png

QQ.png

相關文章
相關標籤/搜索