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

本文介绍了一种在iOS应用中通过摇一摇功能快速查看当前页面所在控制器及其导航控制器栈信息的方法。该方法包括收集控制器信息、实现摇一摇功能及在页面中展示信息三部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值