使用 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 无法识别的选择器发送到实例