首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

直通点击,从子视图控制器到父视图控制器的事件

基础概念

直通点击(Pass Through Touch Event)是指在一个视图控制器(如子视图控制器)中,允许触摸事件直接传递到其父视图控制器,而不是在当前视图控制器中处理这些事件。

相关优势

  1. 简化事件处理:可以减少在子视图控制器中处理触摸事件的复杂性。
  2. 统一管理:可以在父视图控制器中统一管理和处理触摸事件,便于代码的维护和扩展。
  3. 提高性能:避免不必要的事件处理,提高应用的响应速度。

类型

  1. 完全直通:所有触摸事件都直接传递到父视图控制器。
  2. 条件直通:根据特定条件决定是否将触摸事件传递到父视图控制器。

应用场景

  1. 嵌套视图:在嵌套的视图结构中,希望父视图控制器能够处理某些触摸事件。
  2. 自定义手势:在子视图控制器中实现自定义手势,但允许父视图控制器处理其他触摸事件。

常见问题及解决方法

问题:为什么触摸事件没有传递到父视图控制器?

原因

  1. 视图层级问题:子视图控制器中的视图可能遮挡了父视图控制器的视图,导致事件无法传递。
  2. 事件拦截:子视图控制器中的某些视图可能拦截了触摸事件,阻止其传递到父视图控制器。
  3. 代码逻辑问题:在子视图控制器中错误地处理了触摸事件,导致事件无法传递。

解决方法

  1. 检查视图层级:确保父视图控制器的视图没有被遮挡。
  2. 设置视图的userInteractionEnabled属性:确保子视图控制器中的视图允许事件传递。
  3. 设置视图的userInteractionEnabled属性:确保子视图控制器中的视图允许事件传递。
  4. 重写hitTest(_:with:)方法:在子视图控制器中重写该方法,允许事件传递到父视图控制器。
  5. 重写hitTest(_:with:)方法:在子视图控制器中重写该方法,允许事件传递到父视图控制器。

示例代码

以下是一个简单的示例,展示如何在Swift中实现触摸事件的直通:

代码语言:txt
复制
class ParentViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let childViewController = ChildViewController()
        addChild(childViewController)
        view.addSubview(childViewController.view)
        childViewController.didMove(toParent: self)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Parent View Controller: Touches Began")
    }
}

class ChildViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        view.isUserInteractionEnabled = false // 允许事件传递到父视图控制器
    }
}

参考链接

通过以上内容,你应该能够更好地理解直通点击的概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS小技巧·把子视图控制器视图添加到视图控制器

把子视图控制器视图添加到视图控制器并覆盖 添加子控制器 #pragma mark - 添加子控制器 - (void)addSubControllers{ [self addChildViewController...childViewController.view mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; } 把子视图控制器视图添加到视图控制器指定容器视图...,适当时机跳转 添加子控制器 #pragma mark - 添加子控制器 - (void)addSubControllers { _childViewController = [[InfoViewController...removeFromSuperview)]; [self fitFrameForChildViewController:_childViewController]; //设置默认显示在容器View内容...[self.contentView addSubview:_childViewController.view]; } 子VC布局约束 #pragma mark - 子VC布局约束 - (void

94720
  • 控制器视图传值方式

    控制器视图传值方式 (1)Viewdata C:Viewdata["key"]="viewdata"//控制器中赋值 V:Viewdata["key"]//视图中取值 (2)Viewbag...C:Viewbag.key="viewbag"//控制器中赋值 V:viewbag.key//视图中取值 (3)TempData        TempData实际上保存在Session中,控制器每次执行请求时都会从...TempData数据只能在控制器中传递一次,其中每个元素也只能被访问一次,访问之后会被自动删除。...C:Tempdata["key"]="tempdata"//控制器中赋值 V:Tempdata["key"]//视图中取值 (4)Model :必须要有一个对象实体类 ViewData.Model=...: (1)viewdata 传值时不能跨方法,否则值会丢失,只能是在本方法视图 , ViewData只能在一个Action方法中进行设置,在相关视图页面读取,只对当前视图有效。

    1.2K20

    SpringMVC视图控制器(二)

    创建视图控制器现在我们已经配置了 SimpleUrlHandlerMapping 和 InternalResourceViewResolver,可以使用它们来创建视图控制器了。...要创建视图控制器,需要创建一个带有 @Controller 注解类,并在这个类中添加用于处理 URL 方法。...下面是一个创建视图控制器示例:@Controllerpublic class ViewController { @RequestMapping("/home") public String...将视图控制器添加到 DispatcherServlet现在我们已经创建了视图控制器,需要将它们添加到 SpringMVC DispatcherServlet 中。...示例代码为了演示视图控制器使用,我们可以创建一个简单 SpringMVC 应用程序,该应用程序包含一个 HomeController 和一个 AboutController,它们分别用于处理 /home

    34020

    SpringMVC视图控制器(一)

    SpringMVC 视图控制器是一个可以将 URL 映射到视图控制器。它允许开发人员通过简单配置来处理不需要任何逻辑请求,并将它们直接映射到相应视图。...使用视图控制器,可以将控制器代码与视图代码分开,使代码更加清晰易读。...SimpleUrlHandlerMapping 用于将 URL 映射到控制器方法或视图控制器,而 InternalResourceViewResolver 用于将视图名称解析为实际视图。...配置 SimpleUrlHandlerMappingSimpleUrlHandlerMapping 是一个将 URL 映射到控制器方法或视图控制器组件。...它通过将 URL 映射到特定处理程序(例如控制器方法或视图控制器),并为处理程序提供所需参数来实现 URL 映射。

    43210

    iOS翻页视图控制器UIPageViewController应用

    iOS翻页视图控制器UIPageViewController应用 一、引言     UIPageViewController是iOS中少见动画视图控制器之一,通过它既可以创建类似UIScrollView...UIPageViewController把从DataSource中获取到视图数据渲染给View用于当前视图控制器展示。...二、创建一个UIPageViewController     首先新建一个类作为翻页视图控制器中具体每一页视图控制器,使其继承于UIViewController: ModelViewController.h... 这个数据源方法返回视图控制器为要显示视图视图控制器 - (nullable UIViewController *)pageViewController:(UIPageViewController ... 这个数据源方法返回视图控制器为要显示视图视图控制器 - (nullable UIViewController *)pageViewController:(UIPageViewController

    2.2K10

    iOS开发中活动视图控制器UIActivityViewController应用

    iOS开发中活动视图控制器UIActivityViewController应用     在iOS开发中,UIActivityViewController常用来弹出分享面板,其实除了用来社会化分享,UIActivityViewController...先看如下示例代码: //活动内容 NSString * content = @"活动内容"; //活动url NSURL * url = [NSURL URLWithString...系统提供了一些活动类型,例如分享微博、脸书、进行添加提示、发送信息等,系统提供活动类型列举如下(UIActivityType实际上就是NSString*): UIActivityType const...UIActivityType const UIActivityTypeCopyToPasteboard;//复制 UIActivityType const UIActivityTypeAssignToContact;//关联联系人...- (void)prepareWithActivityItems:(NSArray *)activityItems; //子类实现 返回一个视图控制器作为处理活动模态视图 活动处理完成后需要调用activityDidFinish

    3.5K10

    angularjs 控制器、作用域、广播详解

    一、控制器 首先列出几种我们平常使用控制器几种误区: 我们知道angualrJs中一个控制器时可以对应不同视图模板,但这种实现方式存在问题是: 如果视图1和视图2根本没有任何逻辑关系,这样“控制器...在使用控制器时要注意几点: 1.不要去复用controller,一个控制器一般只负责一小块视图;(一般控制器处理都是业务逻辑,业务逻辑复用性一般很小) 2.不要在controller中操作DOM,这不是控制器职责...,控制器之间交互会通过广播事件进行!...Angularjs中不同作用域之间可以通过组合使用$emit,$broadcast,,$on事件广播机制来进行通信 $emit作用是将事件从子级作用域传播至级作用域,包括自己,直至根作用域。...格式如下:$broadcast(eventName,args) $on用于在作用域中监控从子级或级作用域中传播事件以及相应数据。

    1.9K51

    史上最详细iOS之事件传递和响应机制-实践篇

    本篇文章主要介绍如何利用事件处理这些机制来处理公司开发中一些比较棘手需求。例如,点击是A视图,却要让B视图处理事件点击视图,却要让视图处理事件等等。...红色view是绿色view视图,白色view又是红色view视图。如下要求: 需求情景一 当子控件和控件重叠时,点击子控件,子控件响应事件。...原因在于,系统从window向下寻找最合适view时候,遍历红色view时候,发现点不在红色view上,那么默认控制器view就是最合适view。即控制器view响应了事件。...,点击非重叠部分,控件响应事件。...分析:事件响应是顺着响应者链条向上传递,即从子控件传递给控件,touch方法默认不处理事件,而是把事件顺着响应者链条传递给上一个响应者。这样我们就可以依托这个原理,让一个事件多个控件响应。

    8.4K20

    iOS中事件产生和传递

    2.事件传递 ●触摸事件传递是从父控件传递子控件 ●也就是UIApplication->window->寻找处理事件最合适view 注 意: 如果控件不能接受触摸事件,那么子控件就不可能接收到触摸事件...1.点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理事件队列中。...image.png 1.如果当前view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么视图就是当前view上一个响应者,事件就传递给它视图...;如果上级视图仍然无法处理则会继续往上传递;一直传递视图控制器view controller,首先判断视图控制器视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传...(控件子控件),事件响应是从下到上(顺着响应者链条向上传递:子控件控件。

    90310

    iOS面试题:事件传递和响应机制

    事件传递 触摸事件传递是从父控件传递子控件 也就是UIApplication->window->寻找处理事件最合适view 注 意: 如果控件不能接受触摸事件,那么子控件就不可能接收到触摸事件...事件响应 4.1 触摸事件处理整体过程 1 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 2 找到最合适视图控件后,就会调用控件touches方法来作具体事件处理...如何判断上一个响应者 1 如果当前这个view是控制器view,那么控制器就是上一个响应者 2 如果当前这个view不是控制器view,那么控件就是上一个响应者 响应者链事件传递过程 1 如果当前...view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么视图就是当前view上一个响应者,事件就传递给它视图 2 在视图层次结构最顶级视图...: 事件传递是从上到下(控件子控件),事件响应是从下到上(顺着响应者链条向上传递:子控件控件。

    1.2K10

    史上最详细iOS之事件传递和响应机制-原理篇

    所以,不管视图能不能处理事件,只要点击视图就都会产生事件,关键在于该事件最终是由谁来处理!也就是说,如果蓝色视图不能处理事件点击蓝色视图产生触摸事件不会由被点击视图(蓝色视图)处理!...如果当前view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么视图就是当前view上一个响应者,事件就传递给它视图 2>在视图层次结构最顶级视图...首先看initial view能否处理这个事件,如果不能则会将事件传递给其上级视图(inital viewsuperView);如果上级视图仍然无法处理则会继续往上传递;一直传递视图控制器view...则继续交给视图控制器视图,如果根视图不能处理则交给视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃...(控件子控件),事件响应是从下到上(顺着响应者链条向上传递:子控件控件。

    11K70

    从 0 1 搭建技术中台之 iOS 可视化埋点实践

    页面所属控制器存在自定义控制器 例如:一个控制器包含了若干子控制器,且通过 UIScrollView 分页方式呈现各子控制器视图。...内容偏移事件,根据 contentOffset 计算当前显示视图属于哪一个控制器,最后手动触发控制器 viewDidAppear: 方法。...但考虑 App 交互多样性和现实成本,这里仅讨论支持点击操作元素。 通常,元素标识由三部分组成 元素在页面视图树中路径 路径由视图树根节点开始,该元素节点节点为止。...元素索引添加时机 建议只从视图控制器所在视图开始添加元素索引。...当前位置 只关注列表中固定位置某个元素。只有当用户点击该元素时产生事件才会纳入统计。

    1.1K20

    swoole框架-swoft实现程圣母与云天明对话功能启动ws服务创建http服务聊天控制器创建视图文件创建ws控制器结果演示

    当万有引力号启动广播按钮,向宇宙发送三体星坐标时,地球已经失去了任何侵略价值。三体人将所有在地球资源全部撤走,但在临别时,安排了程圣母与云天明远程会话。...接下来,我们用swoft来实现他们两人聊天功能。 ? 光年之外对话 PHP果真是宇宙最强语言,星际通话也能办到......创建http服务聊天控制器 swoft 提供了生成控制器文件命令行 ☁ swoft [master] ⚡ php bin/swoft gen:controller chat --prefix /chat...data = compact('uid', 'userName', 'receiveUid'); return view('chat/index', $data); } } 创建视图文件...视图文件用vue.js搭建,对于vue.js不熟悉同学,参见 实例学习vue.js目录 swoft/resources/views/chat/index.php <!

    69420

    iOS 小技能: Responder Chain(响应者链)【下篇】

    发生触摸事件后,系统会将该事件加入一个由UIApplication管理事件队列中 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序主窗口...(keyWindow) 主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,但是这仅仅是整个事件处理过程第一步 找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理 touchesBegan...II 响应者链事件传递过程 1).如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它视图 2).在视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件或消息传递给...2.1 触摸事件处理详细过程 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 找到最合适视图控件后,就会调用控件touches方法来作具体事件处理...如果当前这个view不是控制器view,那么控件就是上一个响应者。 2.2 事件传递完整过程 先将事件对象由上往下传递(由控件传递给子控件),找到最合适控件来处理这个事件

    92630

    编码篇-OC跨多层UI事件传递处理

    场景 一个VCView上放了很多视图,(中间有很多层)我们点击了最上面的一个Button,需要把Buttontag传到 VC中 Paste_Image.png 知识点( 此处不讨论代理回调和通知...而当我控制器中重写这个方法时候, 相当于重写类方法时候, 那么系统就会走子类方法, 那么参数就直接传递给控制器了 *控制器中重写类方法* - (void)routerWithEventName...nextResponder, 也就是cell, cell没有重写类方法, 继续将事件传递给tableView, tableView也没有重写类方法, 于是将事件处理传递给控制器view,控制器view...也没有重写类方法, 于是将事件处理传递给控制器, 控制器重写了类方法, 于是就走控制器重写方法, 进行事件处理, 事件就成功地从button传到了控制器....值得注意是,这样事件传递处理方法,最常见Bug就是当前试图初始化后确实存在,但是没有加载到视图上,才导致方法无法触发。 参考文章

    2.2K30

    【IOS开发基础系列】UIView专题

    (2).因为方法(1)存在一些问题,比如说控制器上面可能由按钮,需要监听按钮点击事件,如果是1,那么按钮事件应该由控制器来进行管理。...当发生屏幕旋转事件时候,UIapplication对象会将旋转事件传递给uiwindow,uiwindow又会将旋转事件传递给它控制器,由根控制器决定是否需要旋转UIapplication->uiwindow...这个只发生在接收者从它视图上移除或者接收者添加到视图中而不是添加到window中。...如果这个点位于接收者之外就返回nil 讨论         这个方法贯穿视图层次发送pointInside:withEvent:消息每一个子视图用来决定那个子视图需要接收触摸事件。...如果一个子视图区域超过视图bound区域(视图clipsToBounds属性为NO,这样超过视图bound区域视图内容也会显示),那么正常情况下对子视图视图之外区域触摸操作不会被识别

    59130

    Angular企业级开发(7)-MVC之控制器

    当然如果我们能够把业务逻辑放到后端REST服务中,就可以开发轻量级AngularJS应用。 涉及多个控制器中使用业务逻辑,需要放到一个公共服务中,然后把改服务注入使用到该业务逻辑控制器中。...(添加事件或方法) 附加行为方式是把方法或事件添加到$scope对象上,以便在控制器对应视图中使用到改方法。...也有很多方法是处理业务,也是附加到$scope对象上。 ng-click对应事件方法在controller里面定义为addItem,所以在视图上我们可以使用addItem方法。...4.1 视图控制器并列 各个控制器从附加DOM元素节点开始,节点对应闭合标签结束地方创建了一个子控制域,单个控制器里面的$scope对象只能访问和调用该控制器范围内属性和方法。...控制器并列Demo 4.2 视图控制器嵌套 默认情况下,AngularJS在当前作用域中无法找到某个属性,就会在级作用域中进行查找。即子级控制器会继承控制器对象。

    1.9K50
    领券