委托的用法,在本文中,将以UITableView列表内,自定义cell的button点击事件委托(delegate)UITableViewController执行任务,如刷新界面、处理数据等为例,进行演示。
1.创建一个 delegate
新建RZDoSomethingDelegate.h文件中:
objc
import <Foundation/Foundation.h>
@protocol RZDoSomethingDelegate <NSObject>
@option
- (void)doSomething:(id)param;
@end
objc
2.委托者声明一个delegate
委托者自定义cell头文件(RZCustomCell.h)中,使用弱引用声明delegate属性
objc
import "RZDoSomethingDelegate.h"
@interface RZCustomCell : UITableViewCell
pragma mark - 委托
@property (nonatomic, weak) id<RZDoSomethingDelegate> delegate;
@end
objc
3.委托者调用delegate内的方法(method)
RZCustomCell.m中,按钮被点击时,使用委托执行任务,传递上下文参数
objc
@implementation RZCustomCell
-
(void)initSubview
{
//button初始化
UIButton *button = [[UIButton alloc] init];
[button addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
} -
(void)onClick
{
[self.delegate doSomething:self.detail];
}
@end
objc
4.被委托者设置delegate,以便委托者调用
在RZUITableViewController.m文件中,设置被委托者
objc
@interface RZUITableViewController () <ZCGiftExchangeDelegate>
@end
@implementation RZUITableViewController
-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RZCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier" forIndexPath:indexPath];
//设置被委托者为viewController自己
cell.delegate = self;if (!cell) {
cell = [[RZCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@“identifier”];}
return cell;
}
@end
objc
5.被委托者实现Delegate 所定义的方法
在RZUITableViewController.m文件中,实现被委托方法
objc
@interface RZUITableViewController () <ZCGiftExchangeDelegate>
@end
@implementation RZUITableViewController
- (void)doSomething:(id)param
{
//接受委托者的参数,进行数据处理、页面刷新等操作
}
@end
objc