添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

通过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交给上一级处理。

    1. 如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。
    2. 如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。
    3. 视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.
    4. 若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`