一、 确定谁是谁的代理,一般如果需要在 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];
}
}