You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS14系统下编辑SwiftUI自定义TextField崩溃问题求助

iOS 14 自定义TextField崩溃解决方案

根因分析

崩溃由iOS 14版本SwiftUI的AttributeGraph渲染框架缺陷导致,对应崩溃栈中的objc_retain野指针访问、_ConditionalContent视图渲染错误两个核心特征,触发点有两个:

  1. 在onReceive回调中直接修改@Binding修饰的text值,与TextField的输入回调、编辑状态变更同时触发,导致属性图更新时序混乱,访问已释放的对象
  2. 使用if条件语句控制错误提示Text的显隐,iOS 14对_ConditionalContent类型的状态同步存在已知bug,叠加根据编辑模式切换两个List的视图结构变更逻辑,进一步提升了崩溃概率

修复方案

  • 调整onReceive内text值修改逻辑,添加主队列异步派发,避免状态变更冲突:
.onReceive(Just(text)) { newValue in
    guard let inputRegex = inputRegex, let value = newValue.last else { return }
    DispatchQueue.main.async {
        if String(value).matches(inputRegex) {
            self.text = newValue
        } else {
            self.text.removeLast()
        }
    }
}
  • 将错误提示的条件显隐改为用opacity控制,绕过_ConditionalContent的iOS 14适配问题:
// 原逻辑删除
// if fieldState == .error, let errorText = errorText {
//    Text(errorText)...
// }

// 替换为如下实现
if let errorText = errorText {
    Text(errorText)
        .foregroundColor(fieldState.color)
        .font(.caption)
        .padding(.bottom, 12)
        .opacity(fieldState == .error ? 1 : 0)
}
  • 如果你后续启用注释中的自定义ClearableTextFieldStyle,避免在Style实现中直接修改绑定的状态参数,所有状态变更都用异步派发包裹
  • 切换两个List的逻辑同样建议用opacity/offset控制显隐,不要直接用if/else切换视图结构,降低iOS 14下的视图渲染压力

验证说明

以上修改不会影响iOS 15及以上系统的原有功能,修改后可在iOS 14设备上反复触发输入状态切换、非法字符校验、列表切换操作,确认崩溃不再复现。

内容的提问来源于stack exchange,提问作者Mohammed Shakeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:15:03