是否可以将最大长度设置为TextField?我曾考虑使用onEditingChanged事件处理它,但它只在用户开始/完成编辑时被调用,而在用户键入时不被调用.我也看过文件,但还没有找到任何东西.有什么解决办法吗?

TextField($text, placeholder: Text("Username"), onEditingChanged: { _ in
  print(self.$text)
}) {
  print("Finished editing")
}

推荐答案

Paulw11的答案略短一点的版本是:

class TextBindingManager: ObservableObject {
    @Published var text = "" {
        didSet {
            if text.count > characterLimit && oldValue.count <= characterLimit {
                text = oldValue
            }
        }
    }
    let characterLimit: Int

    init(limit: Int = 5){
        characterLimit = limit
    }
}

struct ContentView: View {
    @ObservedObject var textBindingManager = TextBindingManager(limit: 5)
    
    var body: some View {
        TextField("Placeholder", text: $textBindingManager.text)
    }
}

您只需要为TextField字符串提供一个ObservableObject包装器.可以把它想象成一个解释器,每次有更改时都会收到通知,并且能够将修改发送回文本字段.但是,不需要创建PassthroughSubject,使用@Published修饰符将在更少的代码中获得相同的结果.

首先,你需要使用didSet,而不是willSet,否则你可能会陷入一个递归循环.

Swift相关问答推荐

如何在SwiftUI中创建具有圆角顶部和锯齿状底部边缘的自定义Shape,类似于撕破的纸?

如何防止自动状态恢复,如果应用程序被启动打开特定的文档?

如何分解阿拉伯字母?

我可以在预览中通过拖动手势跳转,但在模拟器中失败

NSApplication是否需要NSApplicationDelegate?

从任务中打印

NavigationLink和ObservableObject的动画片段

如何将多个完成处理程序转换为异步?

快速并行读取进程 standardOutput 和 standardError 而不会阻塞

SwiftUI,如何更改具有多个按钮和一个布尔条件的一个按钮标签

在这个使用 URLSession 的简单 case 中是否创建了一个强引用循环?

从一个范围减go 多个范围

确定路径是否相交的有效方法

SwiftUI Preview 不适用于 Core Data

对齐时如何避免图像尺寸缩小

(SwiftLint)如果有正文,如何编写规则(可能是自定义),在{之后总是\n(换行)?

调用从 SwiftUI 视图传递到 PageViewController.Coordinator 的函数

Swift - 获取本地日期和时间

Swift 3:日期与 NSDate?

try 在解除分配时加载视图控制器的视图... UIAlertController