起因:新项目的首页需要动态配置,考虑从一个工厂根据数据加载出不同的view再返回给C层用以展示 问题:由于C层只知道工厂的存在,所有工厂返回的view上的subview中的点击事件是拿不到的 其实解决的办法有很多,就算最坏的情况,拿到工厂返回的view循环遍历subviews在逐个判断iskindof也能实现 正常的做法通常是在工厂上写代理,由工厂做中间层负责传递事件 其实还有一种做法,通过事件响应链
拦截事件处理
- 正因为hitTest:withEvent:方法可以返回最合适的view,所以可以通过重写hitTest:withEvent:方法,返回指定的view作为最合适的view。
- 不管点击哪里,最合适的view都是hitTest:withEvent:方法中返回的那个view。
- 通过重写hitTest:withEvent:,就可以拦截事件的传递过程,想让谁处理事件谁就处理事件。
传递顺序
产生触摸事件->UIApplication事件队列->[UIWindow hitTest:withEvent:]->返回更合适的view->[子控件 hitTest:withEvent:]->返回最合适的view
在橘色view里面有一个白色的subview,不通过橘色view达到C层能直接拿到白色view上的事件 橘色view
白色view
控制器
控制台打印
如果cell内有多个控件都许响应用户事件时,可以考虑用这种做法