我今天遇到一个非常奇怪的事情:我的自定义ViewController偶尔会错过响应链
首先我有一个自定义UIView,UIButton作为其子视图,然后像往常一样设置目标动作:
[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
当然,我在自定义UIViewController
中实现了closeButtonPressed方法在大多数时候,它运作良好。但偶尔,我的ViewController会错过tap事件,最后我发现,tap事件传递给AppDelegate,并调用AppDelegate中的closeButtonPressed方法!
我在这个问题上度过了一整天,但仍然不知道为什么。你能告诉我一个线索吗?非常感谢。以下是代码,希望它可以提供帮助:初始化并呈现我的ViewController和View的代码:
YLSRegisterStepOneViewController *step1Controller = [[YLSRegisterStepOneViewController alloc] initWithNibName:nil bundle:nil];
step1Controller.view = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType];
step1Controller.modalPresentationStyle = UIModalPresentationFormSheet;
step1Controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:step1Controller animated:YES completion:nil];
UIView的代码:
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
closeButton.frame = CGRectMake(10, 10, 50, 50);
[closeButton setTitle:NSLocalizedString(@"button_close", @"") forState:UIControlStateNormal];
[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:closeButton];
UIViewController的代码:
-(void) closeButtonPressed
{
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];// to dismiss self
}
附加:除了UIButton,还有一个UITextField。当这个问题发生时,如果我单击UITextField,然后单击UIButton,UIViewController工作正常
答案 0 :(得分:1)
您可以像这样设置YLSRegisterStepOneView
的控制器属性:
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;
您可以使用YLSRegisterStepOneView
的{{1}}方法添加按钮,不是吗?
所以initWithFrame:
self.controller在这里仍然是零。
[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
之后调用 step1View.controller = step1Controller;
更新:
你说响应者链让你感到困惑,我认为问题是你分配了视图控制器的视图属性,就像这个[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
一样,不建议这样做。如果要将自定义视图用作viewcontroller的视图,请执行以下操作:
在viewcontroller中覆盖step1Controller.view = step1View;
方法。
您可以覆盖此方法以手动创建视图。如果选择这样做,请将视图层次结构的根视图分配给视图属性。您创建的视图应该是唯一的实例,不应与任何其他视图控制器对象共享。您对此方法的自定义实现不应调用super。
loadView
答案 1 :(得分:0)
我看不到您在哪里设置您在此处传递的自定义视图的控制器属性:
[closeButton addTarget:*self.controller* action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];
我认为如果你在视图中创建/设置控制器属性,它将解决问题(除非你已经在做,但代码不在这里)。