1,block:传递是copy
通过协议传递一个回调的completeBlock,实现双向代理.如果协议是多级的,block被多层传递,则可能会多次调用回调的block。解决的办法是在最初传出去的地方调用过过后就置为nil,但是这里要把传递的block定义为一个变量,注意:block的传递是copy的,即使将最初的block置为nil,外部传出的block也能够回调回来,在回调时要判断block是否存在。最初传递点击事件的view的点击事件如下:
- (IBAction)minusClick:(id)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(addMinusView:clickType:complete:)]) {
__block void(^block)(BOOL result) = ^(BOOL result) {
if (block) { //即使block置为空,外部传递的block是copy,外部也是可以回调回来,故做判断
if (self.number) {
self.number = self.number - 1;
}
block = nil;
}
};
[self.delegate addMinusView:self clickType:(OKCommonAddMinusClickTypeLeft) complete:block];
}
}
2,事件传递太多时,可以用NSResponder的事件链来找到对应要处理事件的view或控制器。然后用performSelector处理事件.
/**
获取当前视图的父视图控制器
@return 控制器
*/
- (UIViewController *)superViewController
{
UIResponder *rsp = self;
while (![rsp isKindOfClass:[UIViewController class]]) {
rsp = rsp.nextResponder;
}
return (UIViewController *)rsp;
}