iOS统计整个App 每个按钮的点击次数

<code>GitHub上的Demo,是最新的代码</code>ClickCountOfButton

在开发的时候需要一个问题,在产品已经完成后,产品经理来了一句

今天上架,顺道统计整个App 每个按钮的点击次数,进行数据分析 

东西都做完了,还整这个,项目原因<code>不能使用友盟</code>,但是作为一个技术宅,如果做不出来,那不是也太逊了吗,于是对需求进行了分析

  • 1.统计每个按钮的点击次数,可以给按钮增加一个 <code >clickedCount</code> 属性每次执行方法<code>clickedCount++</code>

  • 2.如果对象销毁,成员属性就释放,显然这个方法的背后还要做点什么

  • 3.如此同时,整个项目都做完,项目所有的按钮也完毕,如果要增加属性,然后在每个按钮的点击后执行的方法中要添加一些代码,这不是要搞死人的节奏吗,一个项目中的按钮, 何其多啊,而且当时使用的是<code>UIButton</code>系统自带的想一想 ,我所有的点击事件,都是<code>UIButton</code>,怎么拦截<code>UIButton</code>的添加点击事件了,同时还要记录点击的次数

  • 方法一 <code> 继承</code> <code>UIButton</code> (果断放弃,因为整个项目都完成了,可以说项目在没有这个需求下是可以没有问题的,如果使用这个方法,改动太大,那么程序出错的风险也就大,同时时间太长,再次,万一哪个按钮忘记改了,那就没统计到)

  • 方法二 <code>分类</code>(不需要改源代码的任何代码,只需要增加一个分类,侵入性小,采取)

  • 方法三 <code>runtime</code>这里也用到了

使用分类重写UIButton的方法

    /** 拦截了UIButton 所有的  
     - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 
    方法*/
    - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents{  
 
     //block循环引用
     __weak typeof(target) weakTarget = target;

    //利用 关联对象 给UIButton 增加了一个 block 
     [self  setCurrentActionBlock:^{ 
        //运行时 发送 消息 执行方法
         ((void (*)(void *, SEL, UIView *))objc_msgSend)((__bridge void *)(weakTarget), action , nil); 
     }]; 
        //拦截了本身要执行的action 先执行,写下来的 xw_clicked:方法       
        [super addTarget:self action:@selector(xw_clicked:) forControlEvents:controlEvents];
    }

    //拦截了按钮点击后要执行的代码
    - (void)xw_clicked:(UIButton *)sender{  
      //统计 
      self.btnClickedCount++; 
      NSLog(@"%@ 点击 %ld次 ",[sender titleForState:UIControlStateNormal], self.btnClickedCount);  
      //执行原来要执行的方法 
      sender.currentActionBlock();
    }
      //在分类中增加了 btnClickedCount的 (setter 和 getter)方法,使用关联对象增加了相关的成员空间
    - (NSInteger)btnClickedCount{  
        id tmp = objc_getAssociatedObject(self, &xw_btnClickedCount); 
        NSNumber *number = tmp; 
        return number.integerValue;
    }

    - (void)setBtnClickedCount:(NSInteger)btnClickedCount{ 
        objc_setAssociatedObject(self, &xw_btnClickedCount, @(btnClickedCount), OBJC_ASSOCIATION_ASSIGN);
    }

测试代码

     - (void)viewDidLoad { 
        [super viewDidLoad];  
        //添加两个按钮到View上面 
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
        btn.frame = (CGRect){100,200,50,50}; 
        [btn addTarget:self action:@selector(btn1Clicked:) forControlEvents:UIControlEventTouchUpInside]; 
        [btn setTitle:@"添加A" forState:UIControlStateNormal]; [self.view addSubview:btn];   
        UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
        btn2.frame = (CGRect){200,200,50,50}; 
        [btn2 addTarget:self action:@selector(btn2Clicked:) forControlEvents:UIControlEventTouchUpInside]; 
        [btn2 setTitle:@"添加B" forState:UIControlStateNormal]; 
        [self.view addSubview:btn2];
     }
    #pragma mark - 按钮点击事件
    - (void)btn1Clicked:(UIButton *)btn{ 
        NSLog(@"btn1");  
     }
    - (void)btn2Clicked:(UIButton *)btn{ 
        NSLog(@"btn2");
    }
        ```
####效果![这里写图片描述](http://upload-images.jianshu.io/upload_images/624018-561592e95be52b3a?imageMogr2/auto-orient/strip)

Demo下载地址:https://github.com/boyXiong/ClickCountOfButton
个人微信:wrdxxs
个人开源:https://github.com/boyXiong/XWSwiftRefresh
关注我,就会不断推出新文章
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,501评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,022评论 4 62
  • 大家好,我叫赵芙蓉。不念过去,不惧未来?用文字盘点一下即将过去的2016年,带着2017精准定位再出发的计划前行!...
    盛开的芙蓉阅读 559评论 2 2
  • Block 是 iOS4 之后添加的一种语法结构,也成为闭包,或者匿名函数。在 iOS 中被广泛的使用,著名的第三...
    MaZengyi阅读 355评论 0 1
  • 文/小叶 踏青时节,阳光明媚。 ——背景 今天我们来谈谈交往,人际交往。 一 结交方式 我也不清楚为何在忙碌洗衣服...
    博土阅读 259评论 8 2