使用 addChildViewController 时的 IBAction 不起作用

Posted

技术标签:

【中文标题】使用 addChildViewController 时的 IBAction 不起作用【英文标题】:IBAction while using addChildViewController not working 【发布时间】:2015-01-19 06:53:26 【问题描述】:

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

下面是项目结构。

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==深灰色。

发生这种情况的任何原因?

Sample project for download


回答

正如 MidhunMP 所说,简短的回答是

menuView 隐藏了底部视图

实际上,对于 menuView,我将 backgroundColor 设置为 clearColor。而且我假设(这是错误的),因为 menuView 很清楚,所以在 menuView 上触摸将不起作用,并且这些触摸将转到 bottomView。

【问题讨论】:

请按“clickme”阐明您的期望 【参考方案1】:

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

menuView 位于bottomView 之上,因此它隐藏了对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];

【讨论】:

现在一切正常,问题是我的菜单视图框架不正确..当我更改为 menuView.frame = CGRectMake(0, 0, 320, 150); 时,一切都很好...... @FahimParkar:如果您需要将视图控制器加载到第一个 ViewController。最好用ContainerView,一个建议。 :) 您是指在 TopMenu 中吗?你能详细说明我需要做什么吗? @FahimParkar:你能查一下1,2,3【参考方案2】:

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

【讨论】:

我没有使用自动布局。我讨厌自动布局。

以上是关于使用 addChildViewController 时的 IBAction 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

addChildViewController与viewWillAppearviewDidAppear关系说明

addChildViewController与viewWillAppearviewDidAppear关系说明

addChildViewController与viewWillAppearviewDidAppear关系说明

UINavigationController 的 addChildViewController 和 topViewController 之间的相互作用

从 UITableViewCell 呈现 UIViewController:addChildViewController 无法识别的选择器发送到实例

addChildViewController 不适合 UIViewController