自定义View 跳转不同界面方法
有时候,我们在自定义UIView 的时候 , 很有可能 会在这个View 进行页面跳转,但是, 你会发现, 那些 push 和 pop 方法 都没什么用 ,那是因为 当一个子view需要接收点击事件,而父view也需要接收点击事件
当然,你可能会说直接调用mysubview.superView即可,这样做也确实是可以做到,但有时子view是不一定知道有这个特定的父view的存在的,如动态添加子view。
所以这里就用到了事件处理与传递。
简单介绍一下
1 2 3
| 继承了UIResponds的对象我们称它为响应者对象 UIApplication、UIViewController、UIView都继承自UIResponder 因此它们都是响应者对象,都能够接收并处理事件
|
1 2 3 4 5
| 当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,交给主窗口. 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 触摸事件的传递是从父控件传递到子控件的. 如果一个父控件不能接收事件,那么它里面的了子控件也不能够接收事件.
|
1 2 3 4 5 6 7 8 9
| - 不接收用户交互时不能够处理事件 userInteractionEnabled = NO - 当一个控件隐藏的时候不能够接收事件 Hidden = YES的时候 - 当一个控件为透明白时候也不能够接收事件 alpha <=0.01
|
注意:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
1 2 3 4
| - 先判断自己是否能够接收触摸事件,如果能再继续往下判断, - 再判断触摸的当前点在不在自己的身上. - 如果在自己身上,UIWindow会从后往前(后创建的子控件开始)遍历子控件,遍历出每一个子控件后,重复前面的两个步骤. - 如果没有符合条件的子控件,那么它自己就是最适合的View.
|
回到主题上来,下面要做的也就是,让子view接收这些事件后,同时把这些事件继续向上传,会一直传到UIApplication为止。而在传的过程中,如果子view接收了这些事件,那么事件会自然终止,我们现在可以做的是同时让子view接收事件,而且还让事件不终止,并继续向上传。
步骤应该是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| UIViewController *superVC;
- (UIViewController *)viewController:(UIView *)view{ UIResponder *responder = view; while ((responder = [responder nextResponder])) if ([responder isKindOfClass: [UIViewController class]]){ return (UIViewController *)responder; } return nil; }
superVC = [self viewController:self]; [superVC.navigationController pushViewController:(UIViewController) animated:YES];
|
这样就可以跳转页面了.