有没有办法捕捉各种用户互动,但首先在iOS应用中按下按钮?我有兴趣用时间戳记录这些事件,理想情况下,他们显示的屏幕名称.
我想最简单的方法是将自定义日志功能的调用插入到按钮调用的每个动作中.但是这太费力了.
我也考虑到子类化UIButton,但这仍然需要我改变现有应用程序中的每个按钮,并且仅适用于按钮(例如,不是表中的单元格).
有一点我可以拦截一般的触动吗?还是有一点我特别知道一个按钮被按下,我有一个参考的按钮?
(我们研究移动应用的可用性测试,所以我们的目标是一个可以轻松重用的模块化解决方案,并尽可能少地手动更改代码,但任何建议都是值得欢迎的,因为我意识到这可能不是那么容易.
解决方法
您可以将UIApplication子类化:
>创建UIApplication子类
>覆盖 – (BOOL)sendAction:(SEL)动作:(id)target from:(id)sender forEvent:(UIEvent *)事件方法,记得调用超级实现
>在执行过程中放置一个NSLog或其他诊断代码
例如,每次按UIButton时,这将打印一个日志:
-(BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event { if ([sender isKindOfClass:[UIButton class]]) { NSLog(@"Action: %@ - %@ - %@",NSStringFromSelector(action),target,sender); } return [super sendAction:action to:target from:sender forEvent:event]; } 2013-07-08 14:46:18.270 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>> 2013-07-08 14:46:27.378 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>>
此外,为了子类化UIApplication,您必须像这样更改main.m文件(在我的例子中,UIApplication子类被命名为FLApplication,请查看UIApplicationMain函数的第三个参数,并导入FLApplication.h)
#import "AppDelegate.h" #import "FLApplication.h" int main(int argc,char *argv[]) { @autoreleasepool { return UIApplicationMain(argc,argv,NSStringFromClass([FLApplication class]),NSStringFromClass([AppDelegate class])); } }