将UIAlertController作为子视图控制器时按钮点击无响应
问题
需要将UIAlertController作为子视图控制器呈现在另一个视图控制器上方,目前弹窗能正常显示,但置于最前方时按钮无法响应点击操作。
代码示例:
UIAlertController* alert = [AlertHelper createAlertWithTitle:title message:message cancelButton:nil continueButtonText:Ok continueAction:nil cancelAction:nil]; alert.view.translatesAutoresizingMaskIntoConstraints = false; [self addChildViewController:alert]; alert.view.frame = self.view.bounds; [self.view addSubview:alert.view]; [alert didMoveToParentViewController:self]; [alert.view.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES; [alert.view.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;
解决方案
核心原因
UIAlertController是苹果设计的标准模态弹窗组件,本身依赖模态呈现的事件响应链机制。直接将它作为子视图控制器添加到父视图上,会破坏其内部的事件传递逻辑,导致按钮无法接收点击事件。
正确实现方式
放弃子VC的添加方式,改用系统标准的模态呈现方法,这是苹果官方推荐的用法,能彻底解决事件响应问题:
UIAlertController* alert = [AlertHelper createAlertWithTitle:title message:message cancelButton:nil continueButtonText:Ok continueAction:nil cancelAction:nil]; // 用系统模态方法呈现,自动维护事件响应链 [self presentViewController:alert animated:YES completion:nil];
若坚持用子VC添加(不推荐)
如果因为特殊场景必须用子VC方式,需要修正布局逻辑以恢复事件响应:
- 移除
alert.view.frame = self.view.bounds:UIAlertController的视图是自适应大小的,不需要铺满父视图,强制设置全屏会干扰其内部事件区域 - 去掉冗余的居中约束:
UIAlertController默认会自动居中显示,手动添加约束会破坏原有布局逻辑 - 确保没有其他视图遮挡弹窗:检查父视图中是否有层级更高的视图覆盖了弹窗区域
但还是强烈建议使用系统标准的模态呈现方式,能避免各种潜在的适配和事件问题。
内容的提问来源于stack exchange,提问作者Simon McNeil
相关产品推荐
相关产品推荐

