UIAlertController添加输入框时出现UICollectionView警告如何解决
带输入框的UIAlertController约束警告问题
问题表现
- 调用
addTextField给alert样式的UIAlertController添加文本输入框后,弹窗触发时控制台输出约束警告,移除文本框后警告不再出现 - 业务代码中未使用
UICollectionView,也未手动修改任何视图的translatesAutoresizingMaskIntoConstraints属性 - 警告在模拟器、实体设备上均可稳定复现
警告原文如下:
Changing the translatesAutoresizingMaskIntoConstraints property of a UICollectionViewCell that is managed by a UICollectionView is not supported, and will result in incorrect self-sizing. View: <_UIAlertControllerTextFieldViewCollectionCell: 0x1529254e0; frame = (0 0; 270 24); gestureRecognizers = <NSArray: 0x600000d56be0>; layer = <CALayer: 0x6000003b5a80>>
复现代码
override func viewDidLoad() { super.viewDidLoad() navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(createAlert)) } @objc private func createAlert() { let alert = UIAlertController(title: "Alert Title", message: nil, preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) let okAction = UIAlertAction(title: "OK", style: .default) { _ in print("Action") } alert.addAction(okAction) alert.addAction(cancelAction) alert.addTextField { textField in } present(alert, animated: true) }
触发原因
这个警告完全是UIKit框架内部实现的问题,和业务代码没有关系:
- 带输入框的alert弹窗内部,苹果是用隐藏的
UICollectionView承载文本输入框的,每一个输入框对应一个私有_UIAlertControllerTextFieldViewCollectionCell实例 - 系统在计算这个cell的自适应高度时,内部逻辑主动修改了cell的
translatesAutoresizingMaskIntoConstraints属性,触发了系统自身的合法性检查,才打出了这条警告 - 该警告不会影响弹窗的正常显示、输入框的交互逻辑,不会造成布局错乱、闪退等实际功能问题,在iOS 14至iOS 17的系统版本上都存在该现象。
处理方案
- 无特殊要求的场景直接忽略即可:这是苹果自身的实现疏漏,不需要修改业务代码,也不会产生线上问题。
- 如果需要屏蔽控制台的这条警告,可以通过添加Xcode日志过滤规则,过滤掉该私有类相关的约束日志;不建议通过runtime方法交换、遍历视图层级修改内部视图属性的方式处理,这类操作依赖系统私有实现,跨版本容易失效,甚至可能触发App Store审核风险。
内容的提问来源于stack exchange,提问作者Nuri
相关产品推荐
相关产品推荐

