iOS語言中的代理模式

什麼是代理,爲何須要代理?ui

當某一個類或者試圖控制器須要完成某些「動做」,可是卻須要另外一個類或者視圖控制器做爲其動做的載體。atom

 

 

實際應用中的單例spa

好比當左側滑欄leftViewController上有用戶登陸後顯示的頭像,點擊頭像會進入用戶設置頁面。而用戶設置頁面實際是須要從rootViewController push進入的。因此當用戶點擊左側滑欄leftViewController上的用戶頭像時,須要左側滑欄的代理rootViewController去執行建立用戶設置頁面並彈入的這一系列操做。這就是一個代理的實現。代理

 

    在這個過程當中,頭像按鈕是屬於左側滑欄leftViewController的點擊事件,然而點擊後的正真執行倒是須要rootViewController來完成。那麼leftViewController的做用就是在用戶點擊頭像按鈕的時候告訴系統,請讓個人代理去執行點擊按鈕後的操做吧。code

 

 

用代碼來實現一個代理blog

首先第一步須要在leftViewController.h裏作以下聲明,@required表示其代理必須執行其下各個方法,@optional表示其代理可選擇性的執行其下的方法 事件

@protocol LeftMenuViewControllerDelegate <NSObject>

@required
- (void)userImageTap:(UIImageView *)sender;

@optional
- (void)loginButtonClicked:(UIButton *)sender;
.
.
.

@end

@interface LeftMenuViewController : UIViewController

@property (nonatomic, assign) id<LeftMenuViewControllerDelegate> delegate;

@end

 

而後須要在leftViewController.m中實現代理方法it

- (void)userImageTap:(id)sender{
    if ([_delegate respondsToSelector:@selector(userImageTap:)]) {
        [_delegate userImageTap:sender];
    }
}

 

最後須要在rootViewController中聲明leftViewController.delegate = self 即rootViewController能夠執行其具體的代理方法操做,最後執行須要執行的代理方法便可io

_leftMenuVC.delegate = self;

- (void)userImageTap:(UIImageView *)sender{
    [self pageReclaim];
    AccountSettingViewController *accountVC = [[AccountSettingViewController alloc]initWithNibName:@"AccountSettingViewController" bundle:nil];
    [self.navigationController pushViewController:accountVC animated:YES];
    [accountVC release];
    [self leftNavigationButtonClicked];
}
相關文章
相關標籤/搜索