通过UIViewController的view属性可以访问到其管理的view对象,及此view的所有subviews。但是根据一个view对象,没有直接的方法可以得到管理它的viewController,但我们使用responder chain可以间接的得到
-(UIViewController*)parentController{
UIResponder *responder = [self nextResponder];
while
(responder) {
([responder isKindOfClass:[UIViewController
class
]]) {
return
(UIViewController*)responder;
responder = [responder nextResponder];
return
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
if (tmpWin.windowLevel == UIWindowLevelNormal)
window = tmpWin;
break;
UIView *frontView = [[window subviews] objectAtIndex:0];
id nextResponder = [frontView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
result = window.rootViewController;
return result;
2.获取当前屏幕中present出来的viewcontroller。
- (UIViewController *)getPresentedViewController
{
UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *topVC = appRootVC;
if (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}
return topVC;
}
[[self superview ].nextResponder
method];
[[[self superview ] nextResponder]
method];
[self.nextResponder method];
官方文档中的解释
UIView implements this method by returning the UIViewController object that manages it (if it has one) or its superview (if it doesn’t); UIViewController implements the method by returning its view’s superview; UIWindow returns the application object, and UIApplication returns nil.
也就是说响应事件是一层一层进行传递的
当用户 与 iPhone的触摸屏 产生 互动时,硬件 就会探测到 物理接触 并且 通知 操作系统。接着 操作系统 就会创建 相应的事件 并且 将 其 传递给 当前正在运行的应用程序的事件队列。然后 这项事件 会被事件循环 传递给 优先响应者物件。优先响应者物件 是 事件 被触发时 和 用户 交互的物件,比如 按钮物件、视图物件。如果 我们 编写了 代码 让 优先响应者 处理 这种类型的事件,那么 它 就会处理 这种类型的事件。处理完 某项事件后,响应者 有 两个选项:1、将 其 丢弃;2、将 其 传递给 响应链条中的下一个响应者。下一个响应者的地址 存储 在当前响应者物件所包含的变量nextResponder当中。如果 优先响应者 无法处理 一项事件,那么 这项事件 就传递给 下一个响应者,直到 这项事件 到达 能处理它的响应者 或者 到达 响应链条的末端,也就是 UIApplication类型的物件。UIApplication类型的物件 收到 一项事件后,也是 要么 处理,要么 丢弃。
“
比如 有 一个视图物件,这个视图物件上 有 一个按钮物件。当用户 触摸 这个按钮物件时,作为优先响应者,这个按钮物件 就会收到 一项事件。如果 这个按钮物件 无法处理 这项事件,就会将 这项事件 传递给 视图物件。如果 视图物件 无法处理 这项事件,就会将 这项事件 传递给 视图控制器物件。以此类推。
应该注意的 是 当我们 在使用 响应链条时,一项事件 并不会自动地 从一个响应者 传递到 下一个响应者。如果 要将 一项事件 从一个响应者 传递到 下一个响应者,我们 必须编写 代码 才能办到。
上文提到了responder chain,responder chain是一系列连接的responder对象,通过responder对象可以将处理事件的责任传递给下一个,更高级的对象,即当前responder对象的nextResponder。
-
UIView的nextResponder属性,如果有管理此view的UIViewController对象,则为此UIViewController对象;否则nextResponder即为其superview。
-
UIViewController的nextResponder属性为其管理view的superview.
-
UIWindow的nextResponder属性为UIApplication对象。
-
UIApplication的nextResponder属性为nil。
iOS
系统
在处理事件时,通过UIApplication对象和每个UIWindow对象的sendEvent:方法将事件分发给具体处理此事件的responder对象(对于触摸事件为hit-test view,其他事件为first responder),当具体处理此事件的responder不处理此事件时,可以通过responder chain交给上一级处理。
-
如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。
-
如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。
-
视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.
-
若UIApplication对象不处理此事件,则事件被丢弃。
通过UIViewController的view属性可以访问到其管理的view对象,及此view的所有subviews。但是根据一个view对象,没有直接的方法可以得到管理它的viewController,但我们使用responder chain可以间接的得到-(UIViewController*)parentController{ UIResponder *res
ios
中的其他ui控件,如UIWindow,UIButton,UIlabel等都是继承自
UIView
,也就是说,他们的
响应
事件
也是如
UIView
一样,由UIResponder负责,比如,单指点击,滑动,缩放等,而其中则是由The Responder Chain负责各种交互在不同层次的
传递
与判断由谁
响应
。
在官方文档中介绍了如何寻找hit-test view 和 first responder o...
@Override
public List getAllUrl() {
RequestMappingHand
ler
Mapping mapping = applicationContext.getBean(RequestMappingHand
ler
Mapping.class);
//
获取
url与类和方法的对应信息
Map<RequestMappingIn.
- (
UIView
Controller
*)
viewController
for (
UIView
* next = [self superview]; next; next = next.superview)
UIResponder *nextResponder = [next nextResp
某天产品提出一个需求,xxxxx情况下出现一个从右向左的跑马灯,点击要跳转到H5。开发一想,不就是个简单的平移动画吗?so easy,答应了下来。
键盘噼里啪啦半个小时后,嗯,代码基本可以了,运行起来。喔,动画出来了,完美。点击之后,蛋疼了,为什么没
响应
?通过一番百度谷歌,原来是
iOS
的视图在动画过程默认是不
响应
事件
的。通过一番努力终于找到了解决方案。
给要添加点击
事件
的视图,把点击事
在很多时候,我们自定义了很多层视图放在
ViewController
上,当我们在最上面的那层视图上需要触发ViewContol
ler
来执行个弹窗
事件
或者其他
事件
时候,有很多方法可以来实现,block,代理等都可以实现这个。不过有个系统提供了一有个自带的方法我们可以用起来。
self.nextResponder:寻找下一个
事件
响应
者
不管多少层View,都可以用以下办法id vc = self.ne
// In the view
controller
where you create the subviews
// (not sure from your question, but I think you are adding image views to a scroll view
UIView
*view = [[
UIView
alloc] init];
UITapGestureReco
文章转自:http://www.cnblogs.com/zy1987/p/3195645.html
UIView
除了负责展示内容给用户外还负责
响应
用户
事件
。本章主要介绍
UIView
用户交互相关的属性和方法。
1、交互相关的属性
userInteractionEnabled 默认是YES ,如果设置为NO则不
响应
用户
事件
,并且把
当前
控件从
事件
队列中删除。也就是说设置了userInterfa
一 、
UIView
和CALayer的区别
UIView
继承自继承自UIResponder的类,只有继承UIResponder的类才能处理
事件
(如触摸、点击等
事件
),参与
事件
响应
链,而CALayer继承自NSObject,不能处理
事件
。
UIView
侧重于内容显示的管理,CALayer侧重于内容的绘制。
UIView
和CALyer是相互依赖的关系。
UIView
的显示依赖于CALyer的提供的内容,而CALyer则依赖
UIView
的容器来显示绘制的内容。
UIView
来自CALyer,高于CALyer,是CA
An unexpected version directory `Objective-C` was encountered for the'<xxx>'Pod in the `xxx`