runtime 유틸리티 - AssociatedObject

2397 단어

UIGestureRecognizer


UIGesture Recognizer의 조작 압력을 완화시키고 하나의 Block으로 서로 다른 제스처 사이의 호출을 해결합니다.기본 코드
#import "UIGestureRecognizer+block.h"
#import 
#import 

static const int target_key;

@implementation UIGestureRecognizer (block)

+(instancetype)xjg_gestureRecognizerWithActionBlcok:(XJGestureBlock)block{
    return [[self alloc]initWithActionBlock:block];
}

-(instancetype)initWithActionBlock:(XJGestureBlock)block{
    self = [self init];// init     ,   -      self       ,      block  。                   ~
    [self addActionBlcok:block];
    [self addTarget:self action:@selector(invoke:)];
    return self;
}

- (void)addActionBlcok:(XJGestureBlock)block{
    if(block){
        objc_setAssociatedObject(self, &target_key, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
}
- (void)invoke:(id)sender{
    XJGestureBlock block=objc_getAssociatedObject(self, &target_key);
    if(block)
        block(sender);
}

@end

github 소스

UIAlertView


여러 개의alertview가 코드를 불필요하게 만들었습니다
//    
- (void)firstClick{
    UIAlertView *al = [[UIAlertView alloc]initWithTitle:@"first" message:@"ok" delegate:self cancelButtonTitle:@"cancle" otherButtonTitles:@"OK", nil];
    al.block = ^(UIAlertView *alert,NSUInteger index){
        if(index ==1)
            NSLog(@"001");
    };
    [al show];
}
//    
#import "UIAlertView+block.h"
#import 
#import 

@interface UIAlertView ()

@end
@implementation UIAlertView (block)

- (void)setBlock:(JGAlertBlock)block{
    objc_setAssociatedObject(self, @selector(block), block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    self.delegate = self;
}

- (JGAlertBlock)block{
    return objc_getAssociatedObject(self, @selector(block));
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if(self.block)
        self.block(alertView,buttonIndex);
}

@end

github 원본 코드는 이 스타일을 보면 왜 애플 iOS9이alertview를 폐기하고 UIAlert View Controller로 전환하는지 이해할 수 있습니다. 여러 개의alert는 정말 관리하기 어렵고 많은delegate, 코드가 불필요합니다.
위에는 두 가지 다른 사용 스타일이 있는데 첫 번째는 에이전트가 아닌 상황에서 서로 다른 제스처에 Block을 채웠다.여러 개의 제스처를 구분하고 두 번째는 에이전트가 있는 상황에서 서로 다른alert를 구분하는데 모두 associated 기능을 사용합니다.방식은 다르다.곰곰이 생각하다

좋은 웹페이지 즐겨찾기