一丶問(wèn)題
在多個(gè)控制器,跳轉(zhuǎn)之后,想回到rootControl,調(diào)用
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;
但是rootControl怎么知道是哪個(gè)控制來(lái)的?
實(shí)現(xiàn)思路:
1.delegete
2.notification
3.block
以上是基本思路,但是比較繁瑣;
利用hook思想;
在系統(tǒng)調(diào)用popToRootViewControllerAnimated之前,把棧最上層的Controller 發(fā)給RootControl;
二丶代碼實(shí)現(xiàn)
思路:
//1.獲取實(shí)例方法;
class_getInstanceMethod
//2.獲取方法實(shí)現(xiàn)
method_getImplementation
//3 添加自己的實(shí)現(xiàn)block,
注意下id self, SEL _cmd 是oc方法的隱式參數(shù);必填;
imp_implementationWithBlock
添加自己的代碼后,必須調(diào)用
popToRootIMP(self,_cmd,anima);
不然不會(huì)實(shí)現(xiàn)跳轉(zhuǎn);
//4.設(shè)置方法實(shí)現(xiàn)
method_setImplementation
+(void)load
{
Method popToRootMethod = class_getInstanceMethod([UINavigationController class], @selector(popToRootViewControllerAnimated:));
IMP popToRootIMP = method_getImplementation(popToRootMethod);
IMP customIMP = imp_implementationWithBlock(^(id self, SEL _cmd,BOOL anima){
UINavigationController *nav = self;
UIViewController *toVc = nav.childViewControllers.firstObject;
UIViewController *fromVc = nav.childViewControllers.lastObject;
NSLog(@"我從%@ 來(lái),要到%@去",fromVc,toVc);
popToRootIMP(self,_cmd,anima);
});
method_setImplementation(popToRootMethod, customIMP);
}
之后看Log日志:
我從<ThreeViewController: 0x7fb936c243e0> 來(lái),要到<ViewController: 0x7fb936d0a6a0>去
三丶總結(jié)
利用hook思想;
能把復(fù)雜的問(wèn)題瞬間簡(jiǎn)單化;
像之前的AOP編程,
Runtime的深入使用,才知道Objective-C的強(qiáng)大之處;