今天发现一个偶现的BUG,当点击一个UIButton时,大部分情况下,对应的ViewController可以正确捕获到此tap event。但是有时此事件会跳过ViewController,被responder chain里的最后一个responder即AppDelegate处理
一开始,我想依赖responder chain来响应点击,这样就不需要把controller传给view
[closeButton addTarget:nil action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
在UIViewController里,实现closeButtonPressed方法:
-(void) closeButtonPressed
{
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];// 在LoginViewController上调用dismiss方法
}
大部分情况下,上面的代码可以正常工作。但是却存在开头描述的那个BUG,发生的几率大概是20%,最后还是显式地设置了target,不依赖responder chain来传递事件,问题就解决了。所以,
建议尽量不要依赖responder chain
不过一开始我设置target的代码写得不对:
YLSRegisterStepOneViewController *step1Controller = [[YLSRegisterStepOneViewController alloc] initWithNibName:nil bundle:nil];
YLSRegisterStepOneView *step1View = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType];
step1Controller.view = step1View;
step1View.controller = step1Controller;
在UIView里:
[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
上面的代码错了。因为初始化UIView的代码,比设置controller property的代码先执行,所以等于是:
[closeButton addTarget:nil action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
最后修改为:
YLSRegisterStepOneViewController *step1Controller = [[YLSRegisterStepOneViewController alloc] initWithNibName:nil bundle:nil];
step1Controller.view = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType Controller:step1Controller];
[closeButton addTarget:controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
在调用UIView的initWithFrame:OperType:Controller:方法时,就把UIViewController作为参数传进去,这样才正确指定了事件的target
分享到:
相关推荐
将ResponderChain附加为environmentObject。 // In the SceneDelegate or ApplicationDelegate where you have access to the window: let rootView = Example (). environmentObject ( ResponderChain ( for...
LLMNR欺骗工具Responder .docx
内网渗透之Responder攻防(上)1
Laravel开发-responder 使用Fluent分形API转换Laravel雄辩模型
Laravel开发-laravel-responder 一个最小但功能强大的包,为您提供重构控制器的机会。
Laravel开发-api-responder Laravel API响应帮助程序
资源来自pypi官网。 资源全名:responder-0.1.2.tar.gz
Api-laravel-responder.zip,一个用于构建api响应的laravel分形包,它赋予了你分形与laravel优雅的力量。laravel响应器是一个用于构建api响应的包,将分形集成到laravel和lumen中。它可以使用transformers转换数据,...
一、数字抢答器设计 设计一个数字抢答器系统,该系统具有三路抢答输入,能够识别最先抢答的信号,能对回答问题所用的时间进行...(基础分为5分,答对一题得1分,答错或回答超时扣1分,最低0分,不出现负分。)(10分)
Responder: 一个熟悉的Python HTTP服务框架
responder.pdsprj
响应者Responder 旨在侦听多个事件源,并提供一种简单的方法来确定如何响应它们。本地设置确保当前的 CLI 配置文件设置为您的目标 AWS 账户的管理员权限。 将此存储库本地克隆到您的计算机。 全局安装 npm install -...
keil C程序,proteus仿真电路图都有。我自己做过的作品,好用
// STATUS: 400 (bad request){ "error" : { "code" : "MISSING_REQUIRED_PARAMETER" , "message" : "Missing required parameter: name" }}安装 $ npm install error - responder -- save快速开始 // Load the ...
Laravel开发-laravel-doctrine-responder 一个用于API的Laravel包,将分形库包装在一个优雅的Laravel API后面。