我们收到了来自外包的 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 >一个人不会简单地通过类别< 覆盖现有方法/模因 >
我们缺少什么?!?
答案 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)
这是在控制台中打印当前视图控制器类名称的解决方案:
-[UIViewController viewWillAppear:]
expr -- (void) printf("? %s\n", (char *)object_getClassName($arg1))
每当我在项目中迷路时,这对我有很大帮助!
答案 3 :(得分:1)
视图控制器是否共享一个公共基类?如果是这样,你可以把它放在[viewDidAppear:]的基类实现中。如果他们没有共同的基础,那么这可能是一项有价值的任务,因为无论如何它都可能是有用的(常见的分析代码等)
答案 4 :(得分:0)
您可以在Xcode上进行应用程序范围的查找和替换,但不一定会找到所有情况(但您尝试的方法也不一定)。你可以寻找“[super viewDidLoad];”并替换为“[super viewDidLoad]; NSLog(@”当前视图类:%@“,NSStringFromClass(self.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/