主要用途,可以在子视图中通知父视图改变布局或者做一些操作,或者实现从后向前传值。
委托通过@protocol声明,可以定义方法,引用委托的对象,需要实现其方法,方法默认都是@required的,同时可以设置为可选的@optional,首先定义委托ListDidScrollDelegate
,定义列表List类GoodsListCollView
,并在列表类中实现代理的属性
// GoodsListCollView.h
@protocol ListDidScrollDelegate <NSObject>
@required
// 这是代理必须实现的函数
- (void)listViewDidScroll:(UIScrollView *)scrollView;
@optional
// 这是代理可选实现的函数
- (void)closedView;
@end
@interface GoodsListCollView : UICollectionView
// 实现代理属性
@property (assign,nonatomic) id<ListDidScrollDelegate> listDelegate;
@end
因为GoodsListCollView
是一个UICollectionView
,所以我们在该类中实现代理函数scrollViewDidScroll:
,并在函数中实现我们自定义的ListDidScrollDelegate
的必选函数的调用:
// GoodsListCollView.m
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (self.listDelegate && [self.listDelegate respondsToSelector:@selector(listViewDidScroll:)]) {
[self.listDelegate listViewDidScroll:scrollView];
}
}
之后定义一个HomeVC
类,并初始化GoodsListCollView
类,实现其代理以及代理函数
// HomeVC.h
@interface HomeVC : UIViewController
@end
// HomeVC.m
@interface HomeVC ()<ListDidScrollDelegate> // 遵循协议
@property (strong, nonatomic) GoodsListCollView *pddListView;// 初始化
@end
@implementation HomeVC
- (void)viewDidLoad {
self.pddListView = [[GoodsListCollView alloc] init];
self.pddListView.listDelegate = self;
}
@end
#pragma mark - ListDidScrollDelegate
/// GoodsListCollView代理函数
/// - Parameter scrollView: GoodsListCollView类
- (void)listViewDidScroll:(UIScrollView *)scrollView {
// 实现你的操作
}