swift - 使用 SwiftUI 将 TextField 限制为 x 个字符

标签 swift textfield swiftui combine

使用 iOS13.2、Swift-5.1.2、Xcode-11.2,我尝试以下操作:

我想使用 TextField。用户只能在 TextField 中输入 x 个字符。

我的代码如下所示:

import Combine
import SwiftUI

class Entry: ObservableObject {

  @Published var entry = "" {
    didSet {
        entry = String(entry.prefix(6)) // trying to limit to 6 characters
    }
  }
}

并且在上面的代码中,已经有了异常行。

我可以看到 didSet{...} 是错误的(因为我们最终陷入无限循环设置/didSetting 一次又一次)...

将 TextField 限制为 x 个字符的更好方法是什么?

下面是剩余的代码:

struct NumberView: View {
    var body: some View {

        Group {
            HStack {
                Spacer()
                NumberIcon(number: 1)
                NumberIcon(number: 2)
                NumberIcon(number: 3)
                NumberIcon(number: 4)
                NumberIcon(number: 5)
                NumberIcon(number: 6)
                Spacer()
            }
         }
    }
}
struct NumberIcon: View {
    @ObservedObject private var entry = Entry()
    var number: Int = 0
    var body: some View {
        TextField(" ", text: $entry.entry, onEditingChanged: { editing in
            print(editing)
            print(self.$entry)
        })
            .padding()
            .foregroundColor(Color.black)
            .background(Color.green)
            .font(.largeTitle)
            .lineLimit(1)
            .cornerRadius(16.0)
            .clipped()
            .keyboardType(.numberPad)
    }
}

struct NumberView_Previews: PreviewProvider {
    static var previews: some View {
        NumberView()
    }
}

我知道有 UIKit 包装器可以使用旧的 shouldChangeCharactersIn 委托(delegate)方法形成 UITextFieldDelegate - 但我想纯粹使用 SwiftUI(没有 UIKit 代码)来实现字符限制。我该怎么做?

最佳答案

感谢this answer here ,我找到了解决方案:

可以重写 Entry 类:

class Entry: ObservableObject {

    let characterLimit = 6   // limiting to 6 characters
    @Published var entry = "" {
        didSet {
            if entry.count > characterLimit && oldValue.count <= characterLimit {
                entry = oldValue
            }
        }
    }
}

关于swift - 使用 SwiftUI 将 TextField 限制为 x 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58672761/

相关文章:

ios - TableView 行选择更改时的操作

android - 如何在输入值时动态更改文本字段的宽度

javascript - 访问输入字段不起作用

ios - SwiftUI Animation.fluidSpring()替换

ios - 将 TextEditor 文本计数连接到 SwiftUI 中的 ProgressView

swift - 在 Swift 中正确格式化 NSTimer

ios - 自动布局视觉格式语言

reactjs - 如何在 Material ui core 3.9.2 中使用 InputRef

swiftui - 将 SwiftUI ColorPicker 限制为仅在亮/暗模式下工作的颜色

ios - Swift 5 iOS13 - 继续到另一个 Storyboard或未连接的 View Controller 而不创建卡 View