删除第一个字符时,SwiftUI TextField 冻结

Posted

技术标签:

【中文标题】删除第一个字符时,SwiftUI TextField 冻结【英文标题】:SwiftUI TextField freezes when deleting first character 【发布时间】:2020-01-31 02:26:11 【问题描述】:

在 SwiftUI 中为 TextField 指定 minimumScaleFactor 时,TextField 会在您输入文本时正常运行,并在内容不适合 TextView 时减小指定的字体。但是,如果您开始删除字符,一切都会照常进行,直到您删除第一个字符。一切都冻结了。

一开始我认为这是我处理存储文本的变量的方式,在我的应用程序中我将它作为 ObservedObject。但是,在调试冻结的应用程序后,我注意到代码在 TextField 的绘图周围一遍又一遍地循环,一个又一个的函数都指向屏幕上对象绘图的错误。

以下代码说明了这个问题。当您输入字符并删除它们直到您到达第一个字符时,TextField 可以完美运行。它冻结了。

import SwiftUI

struct ContentView: View 

@State var sensorNumber: String = ""

    var body: some View 
        TextField("WC0.000.000.000", text: $sensorNumber)
        .padding(.all, 5.0)
        .font(Font.custom("Helvetica", size:40.0))
        .minimumScaleFactor(0.90)
    

【问题讨论】:

【参考方案1】:

问题似乎与自定义字体的交互有关。显然,我的应用程序使用的是自定义字体,但在这里我只是想简化代码。

如果您不使用自定义字体或未指定 minimumScaleFactor,则此代码不会失败。我找到了一个不是很优雅的解决方法,但在 Apple 修复此错误之前它可以工作:

import SwiftUI

struct ContentView: View 

@State var sensorNumber: String = ""

    var body: some View 
        TextField("WC0.000.000.000", text: $sensorNumber)
        .padding(.all, 5.0)
        .font(Font.custom("Helvetica", size:40.0))
        .minimumScaleFactor(sensorNumber.count < 2 ? 1.0 : 0.90)
    

我正在向 Apple 提交雷达,但在这里寻找更好的解决方案。

【讨论】:

以上是关于删除第一个字符时,SwiftUI TextField 冻结的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中捕获绑定的最后一次更改 / 组合

在添加和删除第二个按钮时保持 SwiftUI 中的导航项按钮对齐

SwiftUI:

SwiftUI:TextField文本输入

SwiftUI - 致命错误:从数组中删除元素时索引超出范围

TextField 接受有限的字符 SwiftUi