学习日记20170105

2017-01-05  本文已影响13人  LX2014

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;

}

上一篇 下一篇

猜你喜欢

热点阅读