iOS 15 RC环境下点击键盘时应用发生崩溃是什么原因?
问题根因
你代码中的UITextField被定义为计算属性,每次访问textField变量都会创建一个全新的UITextField实例:
- 调用
self.view.addSubview(textField)时创建了实例A并添加到视图上 - 后续添加约束时每次访问
self.textField都会生成新的实例,这些实例未被添加到视图上,约束也没有生效到实际可见的实例A
iOS 15调整了UITextField的键盘输入响应逻辑,系统处理按键输入时会查找对应文本框的属性,拿到类型错误的对象后触发了stringByTrimmingCharactersInSet方法找不到的崩溃,iOS 14没有该层系统调用所以运行正常。
修复方案
将textField从计算属性改为存储属性,确保全局只初始化一次即可,修改后的视图控制器代码如下:
import UIKit class TestViewController: UIViewController { // 改为闭包初始化的存储属性,仅生成一次实例 private let textField: UITextField = { var v = UITextField() v.translatesAutoresizingMaskIntoConstraints = false return v }() override func viewDidLoad() { super.viewDidLoad() self.setup() } private func setup() { self.view.addSubview(textField) NSLayoutConstraint.activate([ self.textField.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), self.textField.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), self.textField.heightAnchor.constraint(equalToConstant: 50), self.textField.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.8) ]) } }
如果修改后仍有崩溃,可逐一排查引入的第三方依赖库是否有全局HookUITextField输入相关方法的逻辑,部分旧版本依赖库未适配iOS 15会触发该类系统层面的异常。
内容的提问来源于stack exchange,提问作者AnaMM
相关产品推荐
相关产品推荐

