使用 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
。
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];
您用作容器的视图被其他视图覆盖。
我正在制作示例项目来实现顶部菜单。
下面是项目结构。
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
。
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];
您用作容器的视图被其他视图覆盖。