利用摇一摇展示导航控制器中的控制器ClassName方便调试

来源:互联网 发布:mac如何删除照片图库 编辑:程序博客网 时间:2024/05/18 16:54

1.背景

调试时, 往往需要确认当前页面所在控制器(Controller), 一般可以通过打断点确认, 也可以使用Facebook提供的工具Chisel 在控制台打印vc的信息(利用pvc命令)信息. 但是这些需要xCode才可以, 不方便及时使用.

2.诉求

如何通过简单的方式, 触发Action, 打印或显示VC的信息呢? 使用利用摇一摇功能 显示当前导航控制器栈信息

  • 一般义务页面是不需要摇一摇功能的, 使用不会导致业务功能冲突.
  • 事件触发简单, 可以提取到控制器公共父类里,不会影响其他逻辑代码.

3.实施

只需要三个步骤完成上述的功能

  • 1.收集控制器信息
  • 2.实现摇一摇功能
  • 3.在页面中显示

3.1 收集控制器信息

首先要拿到当前显示的控制器.

GitHub可以找到

  • 第一步 拿到当前显示的控制器
+ (UIViewController *)findBestViewController:(UIViewController*)vc {    if (vc.presentedViewController) {        // Return presented view controller        return [UIViewController findBestViewController:vc.presentedViewController];    } else if ([vc isKindOfClass:[UISplitViewController class]]) {        // Return right hand side        UISplitViewController *svc = (UISplitViewController *) vc;        if (svc.viewControllers.count > 0)            return [UIViewController findBestViewController:svc.viewControllers.lastObject];        else            return vc;    } else if ([vc isKindOfClass:[UINavigationController class]]) {        // Return top view        UINavigationController *svc = (UINavigationController*) vc;        if (svc.viewControllers.count > 0)            return [UIViewController findBestViewController:svc.topViewController];        else            return vc;    } else if ([vc isKindOfClass:[UITabBarController class]]) {        // Return visible view        UITabBarController *svc = (UITabBarController *) vc;        if (svc.viewControllers.count > 0)            return [UIViewController findBestViewController:svc.selectedViewController];        else            return vc;    } else {        // Unknown view controller type, return last child view controller        return vc;    }}+ (UIViewController*)currentViewController {    // Find best view controller    UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController;    return [UIViewController findBestViewController:viewController];}
  • 第二步 当前控制器是不是嵌套在导航控制器当中, 打印下对应信息
+ (NSString *)controllerInferredString{    NSMutableString *finalString = [NSMutableString string];    if ([self currentViewController].navigationController) {        for (UIViewController *vc in [self currentViewController].navigationController.viewControllers) {            [finalString appendFormat:@"%@->\n",NSStringFromClass(vc.class)];        }    }else{        [finalString appendFormat:@"%@->\n",NSStringFromClass(self.class)];    }    return finalString;}

3.2 实现摇一摇功能

摇一摇功能是iOS系统提供的功能, 可以快速实现

//ViewController 加入以下两方法- (BOOL)canBecomeFirstResponder {    //让当前controller可以成为firstResponder,这很重要    return YES;}- (void)motionEnded:(UIEventSubtype)motionwithEvent:(UIEvent*)event {    if(event.subtype==UIEventSubtypeMotionShake) {      //做你想做的事    }}

在这个事件里, 获取对应控制器信息

-(BOOL)canBecomeFirstResponder{    //让当前controller可以成为firstResponder,这很重要    return YES;}-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{        if (self.navigationController.topViewController != self) {        return;    }    if (event.subtype==UIEventSubtypeMotionShake) {         // 获取的到的信息        NSString *vcInferred = [UIViewController controllerInferredString];        // 在控制台打印        NSLog(@"\n%@",vcInferred);    }}

3.3 在页面中显示

利用Toast显示到页面中, https://github.com/scalessec/Toast

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{        if (self.navigationController.topViewController != self) {        return;    }    if (event.subtype==UIEventSubtypeMotionShake) {         // 获取的到的信息        NSString *vcInferred = [UIViewController controllerInferredString];        // 在控制台打印        NSLog(@"\n%@",vcInferred);        // 显示到页面中        [self.view makeToast:vcInferred];    }}