利用摇一摇展示导航控制器中的控制器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]; }}
阅读全文
0 0
- 利用摇一摇展示导航控制器中的控制器ClassName方便调试
- 控制器和导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 导航控制器
- 把子控制器添加到导航控制器中的四种方法
- 控制器 ------ tabbar控制器 和 导航控制器
- 导航控制器及TabBar控制器
- 导航控制器和标签控制器
- IOS中的UINavigationController(导航控制器)
- XCode 4.2 导航控制器
- 导航视图控制器UINavigationController
- 数据查询
- [FAQ15114]如何获取进程的native调用栈?
- python入门学习
- 给定可能包含重复的数字的集合,返回所有可能的唯一排列。
- URL规范 举例解释
- 利用摇一摇展示导航控制器中的控制器ClassName方便调试
- echarts行走轨迹
- assets.xcassets加入资源
- 关于百度地图开发LBS云检索的一些坑...
- 欢迎使用CSDN-markdown编辑器
- Limit与skip
- Android studio 3.0 对Lambda表达式的支持
- 面试中常用排序算法实现(Java)
- let和const命令