使用 addChildViewController 时 IBAction 不起作用

IBAction while using addChildViewController not working

我正在制作示例项目来实现顶部菜单。

下面是项目结构。

TopMenu 是父视图,其结构如下所示。

在TopViewController中,下面的viewDidLoad就是我的。

NSString *whereToGo = [[NSUserDefaults standardUserDefaults] valueForKey:@"whereToGo"]; // this is DarkGray by default
UIViewController *goToViewController;
goToViewController = [self.storyboard instantiateViewControllerWithIdentifier:whereToGo];
goToViewController.view.frame = bottomView.bounds;
// bottomView is the first view (will bring child here)
[bottomView addSubview:goToViewController.view];
[self addChildViewController:goToViewController];
[goToViewController didMoveToParentViewController:self];

现在,当我执行项目时,我看到深灰色,但是当我单击 Click Me 按钮时,没有任何反应(未调用 IBAction)。

- (IBAction)clickme:(id)sender {
    NSLog(@"clickme==dark gray");
}

我期待的是 当我点击Click Me时,我会看到clickme==dark gray in日志.

发生这种情况的原因是什么?

Sample project for download


回答

如 MidhunMP 所述,简答为

menuView 隐藏了 bottomView

实际上,对于 menuView,我将 backgroundColor 设为 clearColor。我假设(这是错误的),因为 menuView 是清晰的,触摸不会在 menuView 上工作,这些触摸将转到 bottomView。

问题很简单,您正在将 goToViewController.view 添加到 bottomView

menuViewbottomView 之上,因此它隐藏了对 goToViewController.view 的触摸。您需要将 goToViewController.view 添加到最顶层的视图,也就是 menuView.

现在您的视图层次结构如下:

bottomView -> goToViewController.view -> menuView

您需要将其更改为:

bottomView -> menuView -> goToViewController.view

将您的代码更改为以下内容并检查:

NSString *whereToGo = [[NSUserDefaults standardUserDefaults] valueForKey:@"whereToGo"]; // this is DarkGray by default
UIViewController *goToViewController;
goToViewController = [self.storyboard instantiateViewControllerWithIdentifier:whereToGo];
goToViewController.view.frame = menuView.bounds;
[menuView addSubview:goToViewController.view];
[self addChildViewController:goToViewController];
[goToViewController didMoveToParentViewController:self];

您用作容器的视图被其他视图覆盖。