ViewController偶尔会错过响应链?

时间:2014-01-03 02:18:21

标签: ios objective-c uiview uiviewcontroller

我今天遇到一个非常奇怪的事情:我的自定义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工作正常

2 个答案:

答案 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];

我认为如果你在视图中创建/设置控制器属性,它将解决问题(除非你已经在做,但代码不在这里)。