[功能]点击ImageView进入页面,时间响应者链实现
app点击一个按钮跳转到另外一个控制器非常常用,但是如果是点击的是UIImageView如何通过模态视图进入另外一个控制器呢?万一这个UIImageView在自定义的cell或者view里面,那该如何做呢?
首先要先知道的是时间响应者链,

响应者链处理原则
1. 点击检测视图或者第一响应者传递事件或动作消息给它的视图控制器(如果它有的话);如果没有一个视图控制器,就传递给它的父视图。
2. 如果一个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的父视图。
3. 在这个视图层次中的每个后续的父视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。
4. 最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对象来处理。
5. 如果UIWindow 对象不能处理,就传给单件应用程序对象UIApplication。
如果应用程序对象也不能处理这个事件或动作消息,将抛弃它。
首先我们新建一个事件响应者链的类别,添加一个方法到uiview
#import <UIKit/UIKit.h> @interface UIView (Additions) -(UIViewController *)viewController; //寻找控制器的方法 @end
实现方法
#import "UIView+Additions.h"
@implementation UIView (Additions)
-(UIViewController *)viewController{
UIResponder *next = [self nextResponder]; //拿到下一个响应者
do {
if ([next isKindOfClass:[UIViewController class]]) { //如果下一个响应者是UIViewController
return (UIViewController *)next;
}else{
next = [next nextResponder];
}
} while (next != nil);
return nil;
}
@end
这样我们就通过类别的方法通过事件响应者链找到控制器的View
接下来自定义一UIImageView,头文件是DDImageView.h
#import <UIKit/UIKit.h> typedef void(^ImageBlock)(void); //通过block实现 @interface DDImageView : UIImageView @property(nonatomic,copy)ImageBlock touchBlock;
@end
实现方法
#import "DDImageView.h" @implementation DDImageView - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.userInteractionEnabled = YES; //这里很重要,一定要YES
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchAction:)];//给每一个UIImageView添加一个手势
[self addGestureRecognizer:tapGesture];
[tapGesture release];
}
return self;
} -(void)touchAction:(UITapGestureRecognizer *)tapGesture{ if (self.touchBlock) {
_touchBlock(); //通过Block回调实现
} } -(void)dealloc{ [super dealloc];
Block_release(_touchBlock);
}
接着自定义一个Cell,里面存放我们自定义的view
#import <UIKit/UIKit.h> @class DataModel;
@class DDImageView;
@interface ImageViewCell : UITableViewCell{ DDImageView *_userImage; //用户头像
} //数据模型对象
@property(nonatomic,retain)DataModel *dataModel;
实现方法,这里复写了Model的set方法
-(void)setDataModel:(DataModel *)dataModel{
if (_dataModel != dataModel) {
[_dataModel release];
_dataModel = [dataModel retain];
}
__block ImageViewCell *this = self;
_userImage.touchBlock = ^{
NSString *name = this.imageViewModel.user.screen_name;
UserViewController *userViewController = [[UserViewController alloc] init];
userViewController.userName = name;
[this.viewController.navigationController pushViewController:userViewController animated:YES];
[userViewController release];
};
}
这样就实现了回调功能,能够通过Block实现通过点击头像进入另外一个控制器
[功能]点击ImageView进入页面,时间响应者链实现的更多相关文章
- [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...
- IOS开发中--点击imageView上的Button没有任何反应
点击imageView上的Button没有任何反应: 解决方法:设置图片的userInteractionEnabled为YES,使该imageView可以与用户进行交互
- asp.net 点击按钮,页面没有任何变化,后台代码不触发
asp.net 点击按钮,页面没有任何变化,后台代码不触发 和可能是 asp.net button 缺少validationGroup 导致的,需要查看页面的validation并且让他们抛出错误信 ...
- 响应者链UIResponder-扩大UIButton的点击范围
在开发中,我们经常看到有按钮等的点击,会出现响应事件.按钮->view->ViewController->UIWindow->UIApplication,这就形成了一个响应链. ...
- Easyui实用视频教程系列---Tree点击打开tab页面
Easyui实用视频教程系列---Tree点击打开tab页面 首先 我们 要搭建环境 easyui 环境 然后 把tree 给创建出来 在某个位置 粘贴 下面代码 <ul id="tt ...
- 设置a标签,实现点击跳转页面的两种效果
设置a标签,实现点击跳转页面 这个问题,主要是设置a标签的属性target,下面对target属性进行描述: 跳转在同一个窗口 1,target="_self", 它使得目标文档 ...
- 广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B
广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B注:域名B为afish.cnblogs.com 域名A页面代码:<!DOCTYPE html PUBLIC & ...
- 传奇定时器OnTimer功能详解(泡点、时间触发、任务活动)
传奇定时器OnTimer功能详解(泡点.时间触发.任务活动) 定时器功能,是传奇服务端中非常常见的一种功能,常见如:泡点脚本.赌博脚本,任务活动指定时间刷怪,时间触发一些都需要用到OnTimer功能, ...
- ##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势
##DAY4 事件的基本概念.触摸的基本概念.响应者链.手势 #pragma mark ———————事件的基本概念 ——————————— 事件的基本概念: 1)事件是当用户的手指触击屏幕及在屏幕 ...
随机推荐
- Things To Do Before NOI2017
TC div1 10套 数据结构 25题 网络流 10题 字符串 20题 数学 15题 图论 15题 计算几何 5题 提交答案 5题 嗯...先这些吧... 以上所有题目,博客都会有更新--- NOI ...
- 动态规划:DAG-嵌套矩形
据说DAG是动态规划的基础,想一想还真的是这样的,动态规划的所有状态和转移都可以归约成DAG DAG有两个典型模型,一个是嵌套矩形问题一个是硬币问题,这里仅介绍一个嵌套矩形问题 等二轮复习的时候再补上 ...
- python学习笔记 async and await
用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异 ...
- c 語言 控制碼
source code #include <stdio.h> int main() { char *test = "ABC\x41\n"; printf("s ...
- BZOJ1003: [ZJOI2006] 物流运输 trans
物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...
- CSS变形
css3 变形/变换 相关属性 transform transform-origin transform-style:flat/preserve-3d perspective: 长度单位 perspe ...
- 【 Linux 】Keepalived实现双主模型高可用集群
要求: 1. 两台web服务器安装wordpress,数据库通过nfs共享 2. 使用keepalived实现双主模型 环境: 主机: 系统:CentOS6.7 x64 ...
- centeros7的redis-cli命令不生效解决方法(亲测)
如果你已经安装了redis服务器,并且已经启动,但是redis-cli命令无法生效,分析,命令未加入环境变量.那就给redis命令加入环境变量中: 注意点:redis安装目录会有不同,注意下面的PAT ...
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...
- USACO1.3.2修理牛棚
在学习一段时间贪心并写了一些贪心题之后,又一次看到了农夫和牛幸福美满的生活故事(雾).嘛,闲话少说,上题目 在一个暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满 ...