//类别默认遵循其协议
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^popHandleBlock)(UIViewController *currentCtrl);
@interface UIViewController (PopHandle)
//设置当前controller的Navigation代理
- (void)setNavigationControllerDelegate:(id<UINavigationControllerDelegate>)delegate popHandle:(popHandleBlock)popHandle;
@end
NS_ASSUME_NONNULL_END
#import "UIViewController+PopHandle.h"
#import <objc/runtime.h>
@interface UIViewController()
@property (nonatomic,copy)popHandleBlock popAfterHandle;
@property (nonatomic,assign)NSInteger subControllerCount;
@property (nonatomic,assign)bool isFinish;
@end
@implementation UIViewController (PopHandle)
- (void)setNavigationControllerPopHandle:(popHandleBlock)popHandle
{
self.navigationController.delegate = self;
if(popHandle) self.popAfterHandle = popHandle;
}
- (void)setNavigationControllerDelegate:(id<UINavigationControllerDelegate>)delegate popHandle:(popHandleBlock)popHandle
{
self.navigationController.delegate = delegate;
if(popHandle) self.popAfterHandle = popHandle;
}
//
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
NSInteger index = [navigationController.viewControllers indexOfObject:viewController];
if(![navigationController.viewControllers.lastObject isEqual:self] && index < self.subControllerCount){
if(self.popAfterHandle && NO == self.isFinish){
self.popAfterHandle(navigationController);
self.isFinish = YES;
}
}
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if(self.subControllerCount == 0){
self.subControllerCount = navigationController.viewControllers.count;
}
}
- (void)setPopAfterHandle:(popHandleBlock)popAfterHandle
{
if(popAfterHandle){
objc_setAssociatedObject(self, @selector(popAfterHandle), popAfterHandle, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
}
- (popHandleBlock)popAfterHandle
{
return objc_getAssociatedObject(self, _cmd);
}
- (void)setSubControllerCount:(NSInteger)subControllerCount
{
objc_setAssociatedObject(self, @selector(subControllerCount), @(subControllerCount), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)subControllerCount
{
return [objc_getAssociatedObject(self, _cmd) integerValue];
}
//
- (void)setIsFinish:(bool)isFinish
{
objc_setAssociatedObject(self, @selector(isFinish), @(isFinish), OBJC_ASSOCIATION_ASSIGN);
}
- (bool)isFinish
{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
@end
//使用,这里的self是ViewController
[self setNavigationControllerDelegate:self popHandle:^(UIViewController * _Nonnull currentCtrl) {
NSLog(@"%@",currentCtrl);
}];
封装的一个UIButton,主要是思想:
#import <UIKit/UIKit.h>
@interface UIButton (Block)
- (void)eventWithBlock:(void(^)(id sender))block;
@end
//
#import "UIButton+Block.h"
#import <objc/runtime.h>
@implementation UIButton (Block)
- (void)eventWithBlock:(void(^)(id sender))block
{
if(block){
//等同于自动为当前button绑定了一个成员变量,也就是block
objc_setAssociatedObject(self, "this is button block key", block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
[self addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnAction:(id)sender
{
//获取当前block
void(^btBlock)(id sender) = objc_getAssociatedObject(self, "this is button block key");
if(btBlock) btBlock(sender);
}
@end

