一、 確定誰是誰的代理,一般如果需要在 A 中調用 B 的方法,則 B 為 A 的代理
二、 定義協議,在 A 的.h文件 #import xxx
和 @interface xxx
之 間
- 用
@class
聲明 A 是一個類 - 用
@protocol
聲明協議,格式協議名帶前綴的類名開頭,例如:XBAppViewDelegate
- 代理方法前要聲明
@optional
表示方法可不實現 - 代理方法名以去掉前綴的類名開頭,例如:
appViewDidClickDownloadButton
- 代理方法中已經或即將發生的使用
did
和will
,判斷使用should
- 代理方法中需要將當前對象一同傳入
三、 添加代理屬性,在 A 的 @interface xxx
中
#import <UIKit/UIKit.h>
@class MOBTabBar; // 聲明 MOBTabBar 是一個類
@protocol MOBTabBarDelegate <UITabBarDelegate> //正常情況下<>中為NSObject,單當父類也有代理時需要填父類代理
@optional
- (void)tabBarDidClickedPlusButton:(MOBTabBar *)tabBar;
@end
@interface MOBTabBar : UITabBar
@property (nonatomic, weak) id<MOBTabBarDelegate> delegate;
- (void)plusButtonClick;
@end
四、 B 在 .m 文件遵守代理協議,并將 B 賦值為 A 的delegate
// 遵守代理協議
@interface MOBTabBarController () <MOBTabBarDelegate>
// 成為代理
MOBTabBar *myTabBar = [[MOBTabBar alloc] init];
myTabBar.delegate = self;
五、 B 實現代理方法
- (void)tabBarDidClickedPlusButton:(MOBTabBar *)tabBar
{
NSLog(@"點擊了PlusButton" );
}
六、 A 在 .m 文件中調用代理方法,需要先判斷代理方法是有實現
- (void)plusButtonClick
{
if ([self.delegate respondsToSelector:@selector(tabBarDidClickedPlusButton:)]) {
[self.delegate tabBarDidClickedPlusButton:self];
}
}