经常会在在tableviewcell 中有多个事件的需求,删除,跳转,添加等等其他或者更加复杂的操作。
解决方案也很多,block ,代理都是很好的解决方案。
但是效率呢,
每个点击事件一个blcok 参数自定义,
每个点击事件一个delegate 参数自定义,但是点击位置indexpath 确定需要判断。
好烦,我不想写啊。每个tableviewcell 都要来一遭,需求更换又要来一遭,生不如死啊。
我不要啊。
来吧,这个完美的解决方案:
上代码:
@protocol TargetActionProtocol <NSObject>
- (void)addBaseTarget:(id)target action:(SEL)action withObject:(id)object;
@end
#import "TargetView.h"
@interface TargetView()
@property(nonatomic,strong) id target;
@property(nonatomic,assign) SEL action;
@property(nonatomic,strong) id object;
@end
@implementation TargetView
- (void)addBaseTarget:(id)target action:(SEL)action withObject:(id)object{
self.target = target;
self.action = action;
self.object = object;
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSMethodSignature *signature = [self.target methodSignatureForSelector:self.action];
//从签名获得调用对象
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
//设置target
[invocation setTarget:self.target];
//设置selector
[invocation setSelector:self.action];
//注意:设置参数的索引时不能从0开始,因为0已经被self占用,1已经被_cmd占用
if (self.object) {
id object = self.object;
[invocation setArgument:&object atIndex:2];
}
//接收返回的值
[invocation invoke];
}
@end
看完代码,大家应该就明白了。
addTarget:(id)target action:(SEL)action withObject:(id)object
这样的形式很多地方也有用,放在这里再好不过了
写在BaseTableViewCell里面,想用就用,完美解耦,厉害了。
利用OC sendMsg的机制,给某个类发送消息的方式。