协议传值和block一样 懂用于反向传值 可以用协议传值的地方都可以用block传值 这样视图不能做到的事情就可以委托控制器去帮他完成
协议传值有6步
委托方有3步
1.在其.h文件中拟定协议方法
2.定义一个委托的属性
3.监听代理是否能够执行协议方法
#import <UIKit/UIKit.h>
@class MyCollectionViewCell;
@protocol MyCollectionViewCellDegelate <NSObject>
-(void)addImageBtn:(MyCollectionViewCell *)cell;
-(void)cancelImageBtn:(MyCollectionViewCell *)cell;
@end
@interface MyCollectionViewCell : UICollectionViewCell
@property(nonatomic,strong)UIImage * iimage;
@end
-(void)addImageBtn{
if ([self.delegate respondsToSelector:@selector(addImageBtn:)]) {
[self.delegate addImageBtn:self];
}
}
-(void)cancelImageBtn{
if ([self.delegate respondsToSelector:@selector(cancelImageBtn:)]) {
[self.delegate cancelImageBtn:self];
}
}
代理方有3步
1.成为代理
cell.delegate = self;
2.遵守协议
@interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource,MyCollectionViewCellDegelate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
3实现代理方法
#pragma mark ---自定义cell代理方法
-(void)addImageBtn:(MyCollectionViewCell *)cell{
_selectIndex = [self.collectionView indexPathForCell:cell].item;
UIAlertController * alertVc = [UIAlertController alertControllerWithTitle:@"请选择要打开的设备" message:nil preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction * photo = [UIAlertAction actionWithTitle:@"相册" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
//打开相册
[self openPhoto];
}];
[alertVc addAction:photo];
UIAlertAction * camera = [UIAlertAction actionWithTitle:@"相机" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
//打开相机
[self openCamera];
}];
[alertVc addAction:camera];
UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil];
[alertVc addAction:cancel];
[self presentViewController:alertVc animated:YES completion:nil];
}
-(void)cancelImageBtn:(MyCollectionViewCell *)cell{
[_dataArr removeObject:cell.iimage];
[self.collectionView reloadData];
}