經(jīng)常會在在tableviewcell 中有多個事件的需求,刪除,跳轉(zhuǎn),添加等等其他或者更加復(fù)雜的操作。
解決方案也很多,block ,代理都是很好的解決方案。
但是效率呢,
每個點擊事件一個blcok 參數(shù)自定義,
每個點擊事件一個delegate 參數(shù)自定義,但是點擊位置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];
//從簽名獲得調(diào)用對象
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
//設(shè)置target
[invocation setTarget:self.target];
//設(shè)置selector
[invocation setSelector:self.action];
//注意:設(shè)置參數(shù)的索引時不能從0開始,因為0已經(jīng)被self占用,1已經(jīng)被_cmd占用
if (self.object) {
id object = self.object;
[invocation setArgument:&object atIndex:2];
}
//接收返回的值
[invocation invoke];
}
@end
看完代碼,大家應(yīng)該就明白了。
addTarget:(id)target action:(SEL)action withObject:(id)object
這樣的形式很多地方也有用,放在這里再好不過了
寫在BaseTableViewCell里面,想用就用,完美解耦,厲害了。
利用OC sendMsg的機(jī)制,給某個類發(fā)送消息的方式。