app点击一个按钮跳转到另外一个控制器非常常用,但是如果是点击的是UIImageView如何通过模态视图进入另外一个控制器呢?万一这个UIImageView在自定义的cell或者view里面,那该如何做呢?

  首先要先知道的是时间响应者链,

响应者链处理原则

1. 点击检测视图或者第一响应者传递事件或动作消息给它的视图控制器(如果它有的话);如果没有一个视图控制器,就传递给它的父视图。

2. 如果一个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的父视图。

3. 在这个视图层次中的每个后续的父视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。

4. 最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对象来处理。

5. 如果UIWindow 对象不能处理,就传给单件应用程序对象UIApplication。

如果应用程序对象也不能处理这个事件或动作消息,将抛弃它。

首先我们新建一个事件响应者链的类别,添加一个方法到uiview

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface UIView (Additions)
  4.  
  5. -(UIViewController *)viewController; //寻找控制器的方法
  6.  
  7. @end

实现方法

  1. #import "UIView+Additions.h"
  2.  
  3. @implementation UIView (Additions)
  4.  
  5. -(UIViewController *)viewController{
  6.  
  7. UIResponder *next = [self nextResponder]; //拿到下一个响应者
  8.  
  9. do {
  10. if ([next isKindOfClass:[UIViewController class]]) { //如果下一个响应者是UIViewController
  11.  
  12. return (UIViewController *)next;
  13.  
  14. }else{
  15. next = [next nextResponder];
  16. }
  17. } while (next != nil);
  18.  
  19. return nil;
  20. }
  21.  
  22. @end

这样我们就通过类别的方法通过事件响应者链找到控制器的View

接下来自定义一UIImageView,头文件是DDImageView.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. typedef void(^ImageBlock)(void); //通过block实现
  4.  
  5. @interface DDImageView : UIImageView
  6.  
  7. @property(nonatomic,copy)ImageBlock touchBlock;
  8. @end

实现方法

  1. #import "DDImageView.h"
  2.  
  3. @implementation DDImageView
  4.  
  5. - (id)initWithFrame:(CGRect)frame
  6. {
  7. self = [super initWithFrame:frame];
  8. if (self) {
  9. self.userInteractionEnabled = YES; //这里很重要,一定要YES
  10. UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchAction:)];//给每一个UIImageView添加一个手势
  11. [self addGestureRecognizer:tapGesture];
  12. [tapGesture release];
  13. }
  14. return self;
  15. }
  16.  
  17. -(void)touchAction:(UITapGestureRecognizer *)tapGesture{
  18.  
  19. if (self.touchBlock) {
  20. _touchBlock(); //通过Block回调实现
  21. }
  22.  
  23. }
  24.  
  25. -(void)dealloc{
  26.  
  27. [super dealloc];
  28. Block_release(_touchBlock);
  29. }

接着自定义一个Cell,里面存放我们自定义的view

  1. #import <UIKit/UIKit.h>
  2.  
  3. @class DataModel;
  4. @class DDImageView;
  5. @interface ImageViewCell : UITableViewCell{
  6.  
  7. DDImageView *_userImage; //用户头像
  8. }
  9.  
  10. //数据模型对象
  11. @property(nonatomic,retain)DataModel *dataModel;

实现方法,这里复写了Model的set方法

  1. -(void)setDataModel:(DataModel *)dataModel{
  2.  
  3. if (_dataModel != dataModel) {
  4. [_dataModel release];
  5. _dataModel = [dataModel retain];
  6. }
  7.  
  8. __block ImageViewCell *this = self;
  9. _userImage.touchBlock = ^{
  10. NSString *name = this.imageViewModel.user.screen_name;
  11. UserViewController *userViewController = [[UserViewController alloc] init];
  12. userViewController.userName = name;
  13. [this.viewController.navigationController pushViewController:userViewController animated:YES];
  14. [userViewController release];
  15.  
  16. };
  17. }

这样就实现了回调功能,能够通过Block实现通过点击头像进入另外一个控制器

[功能]点击ImageView进入页面,时间响应者链实现的更多相关文章

  1. [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...

  2. IOS开发中--点击imageView上的Button没有任何反应

    点击imageView上的Button没有任何反应:    解决方法:设置图片的userInteractionEnabled为YES,使该imageView可以与用户进行交互

  3. asp.net 点击按钮,页面没有任何变化,后台代码不触发

    asp.net 点击按钮,页面没有任何变化,后台代码不触发 和可能是 asp.net button  缺少validationGroup 导致的,需要查看页面的validation并且让他们抛出错误信 ...

  4. 响应者链UIResponder-扩大UIButton的点击范围

    在开发中,我们经常看到有按钮等的点击,会出现响应事件.按钮->view->ViewController->UIWindow->UIApplication,这就形成了一个响应链. ...

  5. Easyui实用视频教程系列---Tree点击打开tab页面

    Easyui实用视频教程系列---Tree点击打开tab页面 首先 我们 要搭建环境 easyui 环境 然后 把tree 给创建出来 在某个位置 粘贴 下面代码 <ul id="tt ...

  6. 设置a标签,实现点击跳转页面的两种效果

    设置a标签,实现点击跳转页面 这个问题,主要是设置a标签的属性target,下面对target属性进行描述: 跳转在同一个窗口 1,target="_self",  它使得目标文档 ...

  7. 广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B

    广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B注:域名B为afish.cnblogs.com 域名A页面代码:<!DOCTYPE html PUBLIC & ...

  8. 传奇定时器OnTimer功能详解(泡点、时间触发、任务活动)

    传奇定时器OnTimer功能详解(泡点.时间触发.任务活动) 定时器功能,是传奇服务端中非常常见的一种功能,常见如:泡点脚本.赌博脚本,任务活动指定时间刷怪,时间触发一些都需要用到OnTimer功能, ...

  9. ##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势

    ##DAY4  事件的基本概念.触摸的基本概念.响应者链.手势 #pragma mark ———————事件的基本概念 ——————————— 事件的基本概念: 1)事件是当用户的手指触击屏幕及在屏幕 ...

随机推荐

  1. 优化IDEA启动速度,快了好多。后面有什么优化点,会继续往里面添加

    1.优化启动 修改bin/idea.exe.vmoptions文件如下: -Xms256m   初始堆大小-Xmx384m   最大堆大小 -XX:+UseParNewGC   使用并行收集算法 2. ...

  2. NGINX: 配置跨域请求

    说明: 内容全部来自 SegmentFault Developer Nginx 配置跨域请求 跨域请求失败, nginx 报错: 403 No 'Access-Control-Allow-Origin ...

  3. bzoj 2820 mobius反演

    学了一晚上mobius,终于A了一道了.... 假设枚举到i,质数枚举到p(程序里的prime[j]),要更新A=i*p的信息. 1. p|i    这时A的素数分解式中,p这一项的次数>=2. ...

  4. bzoj 1011 近似估计

    开始看这道题的时候没什么思路,后来忍不住看了题解,发现自己真是水啊... 自从学OI来第一次看到用约等的题 首先我们设w[i]为第i个星球的答案,g[i]为第i个星球受到1-g[i]个星球的引力 那么 ...

  5. js事件中绑定另一事件导致事件多次执行

    1.html代码 <input type="button" value="add"> <input type="button&quo ...

  6. MongoDB简介以及下载安装

    什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.运行稳定,性能高 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在 ...

  7. Codeforces Round #433

    我会4题,写了两题,还提交错误n次,掉了40rating(哭丧脸),又被学长D飞了. 学长:我很心疼你的成绩啊: 我:第四题忘记加特判了... 学长:暴力还能写挂. 我:...... ———————— ...

  8. 跟我一起写 Makefile(一)【转】

    转自:http://blog.csdn.net/haoel/article/details/2886 跟我一起写 Makefile 陈皓 概述—— 什么是makefile?或许很多Winodws的程序 ...

  9. 针对“永恒之蓝”攻击紧急处置手册(蠕虫 WannaCry)

    首先确认主机是否被感染 被感染的机器屏幕会显示如下的告知付赎金的界面: 如果主机已被感染: 则将该主机隔离或断网(拔网线).若客户存在该主机备份,则启动备份恢复程序. 如果主机未被感染: 则存在四种方 ...

  10. Codeforces 189A. Cut Ribbon

    题目链接:http://codeforces.com/problemset/problem/189/A 题意: 给你一个长度为 N 的布条, 再给你三个长度 a, b , c.你可以用剪刀去剪这些布条 ...