记录项目中所有UIViewControllers的类名

时间:2012-12-13 17:24:35

标签: objective-c ios uiviewcontroller nslog

我们收到了来自外包的 HUGE 项目,我们正在努力“修复”。项目中有数百个视图控制器。我们的目标是轻松确定我们当前在设备上查看的课程。

我们的解决方案(无效,因此SO问题)如下。

通过以下类别覆盖UIViewController的viewDidAppear方法:

-(void)viewDidAppear:(BOOL)animated
{
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
    [self viewDidAppear:animated];
    //Also tried this:
    //[super viewDidAppear:animated];
}

此类别将放在项目的 .pch 中。

这不需要在数百个视图控制器中放置额外的代码,并且可以轻松打开和关闭。它不起作用,因为,正如我们现在所了解的那样,< meme >一个人不会简单地通过类别< 覆盖现有方法/模因 >

我们缺少什么?!?

7 个答案:

答案 0 :(得分:14)

答案是调整方法!以下是我们提出的建议:

#import "UIViewController+Logging.h"
#import <objc/runtime.h>

@implementation UIViewController (Logging)

-(void)swizzled_viewDidAppear:(BOOL)animated
{
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
    [self swizzled_viewDidAppear:animated];
}

+ (void)load
{
    Method original, swizzled;

    original = class_getInstanceMethod(self, @selector(viewDidAppear:));
    swizzled = class_getInstanceMethod(self, @selector(swizzled_viewDidAppear:));

    method_exchangeImplementations(original, swizzled);

}
@end

答案 1 :(得分:3)

这是

的解决方案

在.pch文件中包含此

#define UIViewController MyViewController
#import "MyViewController.h"

将新的UIViewController子类创建为

.h文件

#import <UIKit/UIKit.h>

#ifdef UIViewController
#undef UIViewController
#endif
@interface MyViewController : UIViewController

@end
#ifndef UIViewController
#define UIViewController MyViewController
#endif

和.m文件

#import "MyViewController.h"

@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"Current View Class: %@", NSStringFromClass(self.class));
}

@end

答案 2 :(得分:2)

这是在控制台中打印当前视图控制器类名称的解决方案:

  • 在Xcode中创建符号断点
  • 对于符号,添加-[UIViewController viewWillAppear:]
  • 对于 Action ,添加Debugger命令和以下表达式:
  • expr -- (void) printf("? %s\n", (char *)object_getClassName($arg1))
  • 检查在评估操作后自动继续

enter image description here

每当我在项目中迷路时,这对我有很大帮助!

答案 3 :(得分:1)

视图控制器是否共享一个公共基类?如果是这样,你可以把它放在[viewDidAppear:]的基类实现中。如果他们没有共同的基础,那么这可能是一项有价值的任务,因为无论如何它都可能是有用的(常见的分析代码等)

答案 4 :(得分:0)

您可以在Xcode上进行应用程序范围的查找和替换,但不一定会找到所有情况(但您尝试的方法也不一定)。你可以寻找“[super viewDidLoad];”并替换为“[super viewDidLoad]; NSLog(@”当前视图类:%@“,NSStringFromClass(s​​elf.class));”

答案 5 :(得分:0)

该应用是否使用导航控制器来显示视图控制器?如果是这样,您可以使用NavigationController的方法报告当前控制器:

    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        [self reportNewController:viewController];
    }

    - (void) reportNewController:(UIViewController *)viewController
    {
        NSString *name = viewController.title;
            NSLog(@"Name is %@",name);
    }

答案 6 :(得分:0)

您可以使用方法调配。这是一个很好的指南: http://nshipster.com/method-swizzling/